문제 설명
얼마 전에 문제가 발생했으며 내부 시스템 호출에서 요청을 반복했을 때 데이터가 혼란 스러웠습니다.
발생 조건 : 요청을 수락하고 요청이 완료되지 않고 동일한 요청이 수락되어 데이터 오류가 발생했습니다 (이전 요청이 완료된 경우 즉시 동일한 요청을 즉시 수락하는 데 아무런 문제가 없습니다).
문제 분석 : 데이터베이스의 더러운 읽기로 인해 발생합니다.
아이디어 문제 해결
1. 큰 잠금 장치를 추가합니다 (구현하는 가장 쉬운 방법이지만 성능이 걱정되며 요청을 차단합니다).
2. 요청 차단 구현 (공유 할 수 있지만 구현 방법은 문제입니다. 우아한 방식으로 구현하고 재사용을 용이하게하는 방법).
3. 수정 및 구현 (원래 코드에 대한 변경 사항은 위험하며 가장 중요한 것은 공유 할 수 없다는 것입니다).
최종 구현 방법
주석 +스프링 AOP에 의해 구현되었습니다
사용
모든 방법에 대해서는 복제하지 않습니다
Class 1:
import static java.lang.annotation.elementtype.method; import java.lang.annotation.documented; import java.lang.annotation.- 보장; import java.lang.annotation.retentionpolicy; import java.lang.annotation.target; @target ({metho})@retention(retentionpolicy.runtime)@documentedpublic @interface notduplication {}카테고리 2 :
import java.lang.reflect.method; import java.util.set; import java.util.concurrent.concurrentskiplistset; import org.aspectj.lang.proeestingjoinpoint; import org.aspectj.lang.annotation.around; import org.aspectj.lang.annot org.aspectj.lang.annotation.pointcut; import org.aspectj.lang.reflect.methodsignature; import org.spramepramework.stereotyp.component;@portublic class notduplicateaop {private static final <string> key = new concurrentskiplistset <> (); @PointCut ( " @annotation (com.hhly.skeleton.base.filter.notduplice)")) public void duplication () {} / ** * 매개 변수 검증 * @param pjp * @return * @throws trashable * / @around ( "duplication ()") (MethodSignature) pjp.getSignature (); 메소드 currentMethod = pjp.getTarget (). getClass (). getMethod (msig.getName (), msig.getParameterTypes ()); // 서명 stringbuilder sb = new StringBuilder (currentMethod.toString ()); Object [] args = pjp.getargs (); for (Object Object : args) {if (object! = null) {sb.append (object.getClass (). toString ()); sb.append (object.toString ()); }} 문자열 부호 = sb.toString (); 부울 성공 = key.add (부호); if (! success) {새로운 ServiceruntImeexception ( "이 방법이 실행되고 반복 될 수 없음"); } try {return pjp.proceed (); } 마침내 {key.remove (sign); }}}위는 이번에 내가 말한 모든 내용 및 관련 코드입니다. 궁금한 점이 있으면 아래의 의견 영역에서 논의 할 수 있습니다. wulin.com을 지원 해주셔서 감사합니다.