上篇文章給大家介紹了mybatis一級(jí)緩存,有需要的朋友可以參考下。
與一級(jí)緩存相比,二級(jí)緩存范圍更大了一些,可以被多個(gè)SqlSession所共用。
同樣是發(fā)送同樣的查詢sql會(huì)先去緩存中找,找不到再去查詢數(shù)據(jù)庫。
每個(gè)namespace的mapper都會(huì)有自己的一個(gè)緩存的空間。
如果兩個(gè)mapper的namespace相同,執(zhí)行mapper查詢到的數(shù)據(jù)將存儲(chǔ)到相同的二級(jí)緩存.
同樣如果有sqlSession執(zhí)行了commit 會(huì)清空二級(jí)緩存.
配置文件(不用配置也是默認(rèn)開啟的):
在sqlMapConfig.xml中:
1
|
<setting name= "cacheEnabled" value= "true" /> |
在相應(yīng)的mapper.xml中:
<cache/>
如果不需要二級(jí)緩存,可以在設(shè)置禁用二級(jí)緩存
1
|
<select useCache= "false" ></select> |
這樣每次都是從數(shù)據(jù)庫中讀取
在執(zhí)行insert,update,delete后會(huì)刷新緩存(清空緩存),可以設(shè)置不刷新
一般不予設(shè)置,設(shè)置可能會(huì)導(dǎo)致臟讀.
1
|
<insert flushCache= "false" ></insert> |
小例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SqlSession session1 = factory.openSession(); SqlSession session2 = factory.openSession(); SqlSession session3 = factory.openSession(); UserMapper mapper1 = session1.getMapper(UserMapper. class ); UserMapper mapper2 = session2.getMapper(UserMapper. class ); UserMapper mapper3 = session3.getMapper(UserMapper. class ); //第一次請(qǐng)求,查詢id為1的用戶 User user1 = mapper1.findUserById( 1 ); System.out.println(user1); //close 將數(shù)據(jù)寫入二級(jí)緩存 session1.close(); //清空二級(jí)緩存,UserMapper下的 user1.setUsername( "mmm" ); mapper3.updateUser(user1); session3.commit(); //第二次查詢會(huì)從緩存中找 User user2 = mapper2.findUserById( 1 ); System.out.println(user2); session2.close(); |
注意此處要進(jìn)行二級(jí)緩存的對(duì)象必須實(shí)現(xiàn)Serilizable接口,因?yàn)檫@些緩存數(shù)據(jù)可能會(huì)反序列化寫到硬盤或者其他地方。
以上所述是小編給大家介紹的Mybatis二級(jí)緩存,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!
原文鏈接:http://blog.csdn.net/i_jack/article/details/53765679