1. 程式人生 > >SSM(五)Mybatis配置緩存

SSM(五)Mybatis配置緩存

兩個 取數 println mage 進行 hint lose alt 緩存

1.在沒有配置的情況下,mybatis默認開啟一級緩存。

1 Object object=mapper.getXxx(object);
2 Object object2=mapper.getXxx(object);

打個斷點測試一下就知道了。

技術分享

在同一個SqlSession中,第一次查詢後,調用mapper相同方法,SqlSession會從一級緩存中取數據,而且得到的是相同的對象。不會發送SQL。

如果SqlSession進行了提交,那麽一級緩存將會清除。

 1 public void test(){
 2         SqlSession session = MyBatisUtil.getSession();
3 IUserDAO mapper = session.getMapper(IUserDAO.class); 4 UserOneToMany user = new UserOneToMany(); 5 user.setUsercode("zhangsan"); 6 UserOneToMany userOneToMany = mapper.getUserOneToManyBills(user); 7 System.out.println("======"+userOneToMany); 8 session.commit();
9 UserOneToMany userOneToMany2 = mapper.getUserOneToManyBills(user); 10 System.out.println("======"+userOneToMany2); 11 session.close(); 12 }

打印結果不同,且發送了兩次SQL,獲得了兩個不同的對象:

技術分享

2.MyBatis開啟二級緩存第一步:大配置中settings節點加入:<setting name="cacheEnabled" value="true"/>

技術分享

第二步:命名空間加入節點:<cache/>

技術分享

這裏<cache/>節點可以設置得更詳細些,比如:

<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>

其中eviction代表回收策略(LRU|FIFO|SOFT|WEAK);flushInterval代表刷新間隔時間,單位是毫秒;size是引用數目,就是緩存中可以存放多少個對象;readOnly只讀,緩存只能讀取不能修改。

簡單說明下四個回收策略:

1.LRU(默認):最近最少使用,移除最長時間不用的對象。

2.FIFO:先進先出,按對象進入緩存的順序移除它們。

3.SOFT:軟引用,移除基於垃圾回收器狀態和軟引用規則的對象。

4.WEAK:弱引用,移除基於垃圾回收器狀態和弱引用規則的對象。

第三步:相應實體類實現Serializable接口

技術分享

技術分享

測試方法不變,觀察結果:

技術分享

首先,程序只發送了一次SQL。其次,第二次取到的數據是從緩存中獲得的,同樣獲取的是兩個不同的對象。

技術分享

SSM(五)Mybatis配置緩存