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

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

使用mybatis如何實現(xiàn)查詢緩存

這篇文章將為大家詳細講解有關(guān)使用mybatis如何實現(xiàn)查詢緩存,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

成都創(chuàng)新互聯(lián)公司10多年成都定制網(wǎng)頁設(shè)計服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及高端網(wǎng)站定制服務(wù),成都定制網(wǎng)頁設(shè)計及推廣,對成都展覽展示等多個行業(yè)擁有豐富的網(wǎng)站運維經(jīng)驗的網(wǎng)站建設(shè)公司。

1 緩存的意義

將用戶經(jīng)常查詢的數(shù)據(jù)放在緩存(內(nèi)存)中,用戶去查詢數(shù)據(jù)就不用從磁盤上(關(guān)系型數(shù)據(jù)庫數(shù)據(jù)文件)查詢,從緩存中查詢,從而提高查詢效率,解決了高并發(fā)系統(tǒng)的性能問題。

使用mybatis如何實現(xiàn)查詢緩存

2 mybatis持久層緩存

mybatis提供一級緩存和二級緩存

使用mybatis如何實現(xiàn)查詢緩存

mybatis一級緩存是一個SqlSession級別,sqlsession只能訪問自己的一級緩存的數(shù)據(jù),二級緩存是跨sqlSession,是mapper級別的緩存,對于mapper級別的緩存不同的sqlsession是可以共享的。

3 一級緩存

3.1 原理

使用mybatis如何實現(xiàn)查詢緩存

第一次發(fā)出一個查詢sql,sql查詢結(jié)果寫入sqlsession的一級緩存中,緩存使用的數(shù)據(jù)結(jié)構(gòu)是一個map

key:hashcode+sql+sql輸入?yún)?shù)+輸出參數(shù)(sql的唯一標識)

value:用戶信息

同一個sqlsession再次發(fā)出相同的sql,就從緩存中取不走數(shù)據(jù)庫。如果兩次中間出現(xiàn)commit操作(修改、添加、刪除),本sqlsession中的一級緩存區(qū)域全部清空,下次再去緩存中查詢不到所以要從數(shù)據(jù)庫查詢,從數(shù)據(jù)庫查詢到再寫入緩存。

每次查詢都先從緩存中查詢:

使用mybatis如何實現(xiàn)查詢緩存
 

如果緩存中查詢到則將緩存數(shù)據(jù)直接返回。

如果緩存中查詢不到就從數(shù)據(jù)庫查詢:

使用mybatis如何實現(xiàn)查詢緩存

3.2 一級緩存配置

mybatis默認支持一級緩存不需要配置。

注意:mybatis和spring整合后進行mapper代理開發(fā),不支持一級緩存,mybatis和spring整合,spring按照mapper的模板去生成mapper代理對象,模板中在最后統(tǒng)一關(guān)閉sqlsession。

3.3 一級緩存測試

//一級緩存 
  @Test 
  public void testCache1() throws Exception { 
 
    SqlSession sqlSession = sqlSessionFactory.openSession(); 
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
     
    //第一次查詢用戶id為1的用戶 
    User user = userMapper.findUserById(1); 
    System.out.println(user); 
     
    //中間修改用戶要清空緩存,目的防止查詢出臟數(shù)據(jù) 
    /*user.setUsername("測試用戶2"); 
    userMapper.updateUser(user); 
    sqlSession.commit();*/ 
     
    //第二次查詢用戶id為1的用戶 
    User user2 = userMapper.findUserById(1); 
    System.out.println(user2); 
     
    sqlSession.close(); 
     
 
  } 

4 二級緩存

4.1 原理

使用mybatis如何實現(xiàn)查詢緩存

二級緩存的范圍是mapper級別(mapper同一個命名空間),mapper以命名空間為單位創(chuàng)建緩存數(shù)據(jù)結(jié)構(gòu),結(jié)構(gòu)是map。

每次查詢先看是否開啟二級緩存,如果開啟從二級緩存的數(shù)據(jù)結(jié)構(gòu)中取緩存數(shù)據(jù),

 使用mybatis如何實現(xiàn)查詢緩存

如果從二級緩存沒有取到,再從一級緩存中找,如果一級緩存也沒有,從數(shù)據(jù)庫查詢。

4.2 mybatis二級緩存配置

在核心配置文件SqlMapConfig.xml中加入

 

使用mybatis如何實現(xiàn)查詢緩存

要在你的Mapper映射文件中添加一行:  ,表示此mapper開啟二級緩存。 

4.3 查詢結(jié)果映射的pojo序列化

mybatis二級緩存需要將查詢結(jié)果映射的pojo實現(xiàn) Java.io.serializable接口,如果不實現(xiàn)則拋出異常:

org.apache.ibatis.cache.CacheException: Error serializing object.  Cause: java.io.NotSerializableException: com.sihai.mybatis.po.User

二級緩存可以將內(nèi)存的數(shù)據(jù)寫到磁盤,存在對象的序列化和反序列化,所以要實現(xiàn)java.io.serializable接口。

如果結(jié)果映射的pojo中還包括了pojo,都要實現(xiàn)java.io.serializable接口。

4.4 二級緩存禁用

對于變化頻率較高的sql,需要禁用二級緩存:

在statement中設(shè)置useCache=false可以禁用當前select語句的二級緩存,即每次查詢都會發(fā)出sql去查詢,默認情況是true,即該sql使用二級緩存。

      <cite id="ke6g8"><rt id="ke6g8"></rt></cite>