中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Mybatis多線程下使用Example的示例

這篇文章主要介紹了Mybatis多線程下使用Example的示例,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司,專注網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)站營銷推廣,域名與空間,網(wǎng)站空間,網(wǎng)站托管運(yùn)營有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問題,請聯(lián)系成都創(chuàng)新互聯(lián)。

前言

服務(wù)器每收到一個(gè)請求,都會從線程池中調(diào)度一個(gè)空閑線程來處理,spring整合的web時(shí),controller和service一般都是單例的,這樣導(dǎo)致無論你的Example標(biāo)注的是單例還是多例,同一個(gè)service下的Example也只有一個(gè),多線程訪問時(shí)產(chǎn)生的

問題如下

問題詳情

工程目錄結(jié)構(gòu)如下

Mybatis多線程下使用Example的示例

MyService 的service()方法接收兩個(gè)參數(shù)并據(jù)此查詢數(shù)據(jù)庫

@Service
public class MyService {
 @Autowired
 StudentMapper studentMapper;
 @Autowired
 StudentExample studentExample;
 public void service(Integer begin,Integer end){
  StudentExample.Criteria criteria1 = studentExample.createCriteria();
  criteria1.andAgeBetween(begin,end);
  List<Student> list=studentMapper.selectByExample(studentExample);
  studentExample.clear();
  System.out.println(list);
 }
}

當(dāng)同時(shí)有兩個(gè)請求時(shí),兩個(gè)請求的StudentExample相同

請求1如下

begin=2,end=8

Mybatis多線程下使用Example的示例

請求2如下

begin=4,end=8

Mybatis多線程下使用Example的示例

先放行請求1,請求1成功添加條件

Mybatis多線程下使用Example的示例

再放行請求2,請求2添加失敗

Mybatis多線程下使用Example的示例

這時(shí)如果請求2在請求1執(zhí)行查詢操作前就已經(jīng)執(zhí)行完studentExample.clear (),請求1的查詢條件就失效了

Mybatis多線程下使用Example的示例

至此兩個(gè)請求都沒有得到正確的結(jié)果。

解決方案

可以使用ThreadLocal為每個(gè)線程配備單獨(dú)的Example,為保證每次都能獲取到值,這里對ThreadLocal簡單擴(kuò)展一下,如果當(dāng)前線程沒有對應(yīng)的Example(多例),就從spring容器中獲取一個(gè)并與這個(gè)線程綁定。

ThreadLocalExtension

public class ThreadLocalExtension<T> extends ThreadLocal<T> {
   //獲取ApplicationContext方法見下
  @Autowired
  ApplicationContext applicationContext;
  public ThreadLocalExtension(){
    super();
  }
  public T get(Class<T> example){
    T bean=super.get();
    if(bean==null){
      super.set((T) applicationContext.getBean(example));
    }
    return super.get();
  }
}

spring泛型依賴注入

由于Example會有很多個(gè),所以這里使用了泛型,spring4.0提供了對泛型依賴注入的支持。

首先實(shí)際類型對應(yīng)的ThreadLocalExtension交由spring管理

@Repository
public class StudentExampleThreadLocal extends ThreadLocalExtension<StudentExample> {
}

然后直接在代碼中注入

@Autowired
ThreadLocalExtension<StudentExample> studentExampleThreadLocal;

修改后的MyService

@Service
public class MyService {
  @Autowired
  StudentMapper studentMapper;
  @Autowired
  ThreadLocalExtension<StudentExample> studentExampleThreadLocal;
  public void service(Integer begin,Integer end){
    StudentExample studentExample = studentExampleThreadLocal.get(StudentExample.class);
    StudentExample.Criteria criteria1 = studentExample.createCriteria();
    criteria1.andAgeBetween(begin,end);
    List<Student> list=studentMapper.selectByExample(studentExample);
    studentExample.clear();
    System.out.println(list);
  }
}

獲取ApplicationContext

創(chuàng)建一個(gè)類實(shí)現(xiàn)ApplicationContextAware,并向spring容器中注入applicationContext

@Component
public class ApplicationContextHelper implements ApplicationContextAware {
  private static ApplicationContext applicationContext;

  public ApplicationContextHelper() {
  }
  @Bean(name="applicationContext")
  public ApplicationContext getApplicationContext(){
    return applicationContext;
  }

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    ApplicationContextHelper.applicationContext = applicationContext;
  }

  public static Object getBean(String beanName) {
    return applicationContext != null?applicationContext.getBean(beanName):null;
  }
}

結(jié)果

至此,整個(gè)改造完成,看看效果

請求1

Mybatis多線程下使用Example的示例

請求2

Mybatis多線程下使用Example的示例

每個(gè)請求獲取到了不同的StudentExample,也就不存在沖突的問題,并且StudentExample沒有大量的創(chuàng)建與銷毀,最多只創(chuàng)建了與服務(wù)器線程池中線程相同的個(gè)數(shù),實(shí)現(xiàn)了重復(fù)使用

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Mybatis多線程下使用Example的示例”這篇文章對大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

網(wǎng)站名稱:Mybatis多線程下使用Example的示例
URL網(wǎng)址:http://www.rwnh.cn/article42/jscehc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)頁設(shè)計(jì)公司、移動(dòng)網(wǎng)站建設(shè)定制網(wǎng)站、微信公眾號網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
岚皋县| 内黄县| 广饶县| 定边县| 罗甸县| 泌阳县| 墨江| 三穗县| 资讯| 孝感市| 鄂托克旗| 江北区| 商南县| 独山县| 湘阴县| 四子王旗| 攀枝花市| 桃园县| 兴安县| 紫金县| 东乡族自治县| 昌平区| 阜平县| 石家庄市| 衡南县| 张北县| 阿鲁科尔沁旗| 许昌县| 石柱| 德兴市| 沂水县| 双柏县| 澎湖县| 丰城市| 托里县| 新密市| 建瓯市| 闵行区| 深州市| 彰武县| 南涧|