真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Mybatis多線程下使用Example的案例-創(chuàng)新互聯(lián)

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

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)延安免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

前言

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

問題如下

問題詳情

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

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

@Servicepublic 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 list=studentMapper.selectByExample(studentExample);  studentExample.clear();  System.out.println(list); }}

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

請求1如下

begin=2,end=8

請求2如下

begin=4,end=8

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

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

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

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

解決方案

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

ThreadLocalExtension

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

spring泛型依賴注入

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

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

@Repositorypublic class StudentExampleThreadLocal extends ThreadLocalExtension {}

然后直接在代碼中注入

@AutowiredThreadLocalExtension studentExampleThreadLocal;

修改后的MyService

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

獲取ApplicationContext

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

@Componentpublic 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

請求2

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

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


網(wǎng)站題目:Mybatis多線程下使用Example的案例-創(chuàng)新互聯(lián)
地址分享:http://weahome.cn/article/eocpd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部