激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - java并發訪問重復請求過濾問題

java并發訪問重復請求過濾問題

2021-05-06 11:09u010704600 Java教程

本篇文章給大家分享了關于java并發訪問重復請求過濾的相關問題以及解決方法,對此有需要的朋友參考學習下。

問題描述

前段時間遇到個問題,自己內部系統調用出現重復請求導致數據混亂。

發生條件:接受到一個請求,該請求沒有執行完成又接受到相同請求,導致數據錯誤(如果是前一個請求執行完成,馬上又接受相同請求不會有問題)

問題分析:是由于數據庫的臟讀導致

問題解決思路

1.加一把大大的鎖 (是最簡單的實現方式,但是性能堪憂,而且會阻塞請求)

2.實現請求攔截 (可以共用,但是怎么去實現卻是一個問題,怎么用一個優雅的方式實現,并且方便復用)

3.修改實現 (會對原有代碼做改動,存在風險,最主要的是不能共用)

最終實現方式

通過注解+spring AOP 的方式實現

使用

通過在任意方法上添加注解NotDuplicate

類1:

java" id="highlighter_459420">
?
1
2
3
4
5
6
7
8
9
10
11
12
import static java.lang.annotation.ElementType.METHOD;
 
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Target({METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NotDuplicate {
}

類2:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.lang.reflect.Method;
import java.util.Set;
import java.util.concurrent.ConcurrentSkipListSet;
 
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
 
 
 
@Aspect
@Component
public class NotDuplicateAop {
 
  private static final Set<String> KEY = new ConcurrentSkipListSet<>();
 
  @Pointcut("@annotation(com.hhly.skeleton.base.filter.NotDuplicate)")
  public void duplicate() {
  }
 
  /**
   * 對方法攔截后進行參數驗證
   * @param pjp
   * @return
   * @throws Throwable
   */
  @Around("duplicate()")
  public Object duplicate(ProceedingJoinPoint pjp) throws Throwable {
    MethodSignature msig = (MethodSignature) pjp.getSignature();
    Method 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());
      }
    }
    String sign = sb.toString();
    boolean success = KEY.add(sign);
    if(!success){
      throw new ServiceRuntimeException("該方法正在執行,不能重復請求");
    }
    try {
      return pjp.proceed();
    } finally {
      KEY.remove(sign);
    }
 
  }
}

以上就是本次給大家講述的全部內容以及相關代碼,如果大家還有任何問題可以在下方的留言區討論,感謝大家對服務器之家的支持。

原文鏈接:https://blog.csdn.net/u010704600/article/details/77799169

延伸 · 閱讀

精彩推薦
776
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 韩国美女一区 | 国产在线免 | 九九热精品在线 | www国产成人免费观看视频,深夜成人网 | 色女人在线 | 天天舔夜夜操 | 91免费在线 | 国产99视频精品免视看9 | 欧美激情精品久久久久久黑人 | 欧美一级特级 | 色七七久久影院 | 99亚洲伊人久久精品影院红桃 | 日韩一级免费毛片 | 欧美黄色免费视频 | 欧美一级黄色录像片 | 午夜91视频 | 久久国产亚洲精品 | 一级空姐毛片 | 韩国精品久久久 | 午夜精品小视频 | 成人小视频免费在线观看 | 精品国产视频一区二区三区 | 日韩毛片在线看 | 日韩欧美电影一区二区三区 | 毛片免费观看视频 | 久久草在线看 | 国产成人精品免费视频大全最热 | 国产一区二区在线免费观看 | 亚洲性生活免费视频 | 精品一区二区三区免费视频 | 成人性生活视频 | 婷婷一区二区三区四区 | 99精品国产成人一区二区 | 狠狠操夜夜爱 | 一级毛片在线免费观看 | 国产色视频一区 | 成人福利在线 | 久久91久久久久麻豆精品 | 欧美18一12sex性处hd | 久草在线播放视频 | 毛片毛片 |