91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-08 02:41:02 來源:腳本之家 閱讀:176 作者:u010704600 欄目:編程語言

問題描述

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

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

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

問題解決思路

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

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

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

最終實現方式

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

使用

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

類1:

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:

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);
    }

  }
}

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杭州市| 板桥市| 栖霞市| 柏乡县| 怀集县| 唐山市| 辽阳市| 都匀市| 温宿县| 策勒县| 兴海县| 清镇市| 凯里市| 双桥区| 偃师市| 丰镇市| 贵南县| 临泉县| 花莲市| 沂源县| 黄骅市| 浠水县| 连山| 东阿县| 临潭县| 南昌市| 武山县| 阳新县| 韩城市| 唐海县| 海林市| 应城市| 龙山县| 南郑县| 龙陵县| 楚雄市| 陕西省| 措美县| 通城县| 怀仁县| 八宿县|