คำอธิบายปัญหา
ฉันพบปัญหาเมื่อไม่นานมานี้และข้อมูลก็สับสนเมื่อฉันได้รับการร้องขอซ้ำในการโทรภายในระบบของฉัน
เงื่อนไขของการเกิดขึ้น: ยอมรับคำขอและคำขอยังไม่เสร็จสมบูรณ์และคำขอเดียวกันได้รับการยอมรับส่งผลให้เกิดข้อผิดพลาดข้อมูล (หากคำขอก่อนหน้านี้เสร็จสมบูรณ์จะไม่มีปัญหาที่จะยอมรับคำขอเดียวกันทันที)
การวิเคราะห์ปัญหา : มันเกิดจากการอ่านฐานข้อมูลสกปรก
แนวคิดการแก้ปัญหา
1. เพิ่มล็อคขนาดใหญ่ (เป็นวิธีที่ง่ายที่สุดในการใช้งาน แต่ประสิทธิภาพนั้นเป็นกังวลและจะบล็อกคำขอ)
2. ใช้การสกัดกั้นคำขอ (สามารถแบ่งปันได้ แต่วิธีการใช้งานเป็นปัญหาวิธีการใช้งานในวิธีที่สง่างามและอำนวยความสะดวกในการใช้ซ้ำ)
3. แก้ไขและนำไปใช้ (การเปลี่ยนแปลงจะทำกับรหัสต้นฉบับซึ่งมีความเสี่ยงและสิ่งที่สำคัญที่สุดคือไม่สามารถแบ่งปันได้)
วิธีการใช้งานขั้นสุดท้าย
ดำเนินการโดย Annotation +Spring AOP
ใช้
notduplicle เกี่ยวกับวิธีการใด ๆ
คลาส 1:
นำเข้า java.lang.annotation.elementtype.method; นำเข้า java.lang.annotation.documented; นำเข้า java.lang.annotation.retention; java.lang.annotation.target; @target ({method})@retention(retentionPolicy.runtime)@documentedPublic @interface notduplicate {}หมวดที่ 2:
นำเข้า java.lang.reflect.method; นำเข้า java.util.set; นำเข้า java.util.concurrent.currentskiplistset; นำเข้า org.aspectj.lang.proceedingjoinpoint; นำเข้า org.aspectj.lang.annotation.around; org.aspectj.lang.annotation.pointcut; นำเข้า org.aspectj.lang.reflect.methodsignature; นำเข้า org.springframework.stereotype.Component;@Aspect@componentPublic NotduplicateAop @PointCut (" @Annotation (com.hhly.skeleton.base.filter.notduplicate)") โมฆะสาธารณะซ้ำ () {} / ** * การตรวจสอบพารามิเตอร์หลังจากการสกัดกั้น * @param pjp * @return * @throws = (MethodSignature) pjp.getSignature (); เมธอด currentMethod = pjp.getTarget (). getClass (). getMethod (msig.getName (), msig.getParameterTypes ()); // แยก Signature StringBuilder SB = ใหม่ StringBuilder (CurrentMethod.toString ()); วัตถุ [] args = pjp.getargs (); สำหรับ (วัตถุวัตถุ: args) {if (object! = null) {sb.append (object.getClass (). toString ()); sb.append (object.toString ()); }} string sign = sb.toString (); ความสำเร็จของบูลีน = key.add (ลงชื่อ); if (! ความสำเร็จ) {โยน serviceruntimeException ใหม่ ("วิธีนี้กำลังดำเนินการและไม่สามารถทำซ้ำได้"); } ลอง {return pjp.proceed (); } ในที่สุด {key.remove (เครื่องหมาย); -ข้างต้นคือเนื้อหาและรหัสที่เกี่ยวข้องทั้งหมดที่ฉันบอกคุณในครั้งนี้ หากคุณมีคำถามใด ๆ คุณสามารถพูดคุยกันในพื้นที่แสดงความคิดเห็นด้านล่าง ขอบคุณสำหรับการสนับสนุน Wulin.com