国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹

2019-11-26 14:17:58
字體:
供稿:網(wǎng)友

一、MyBatis緩存介紹

  正如大多數(shù)持久層框架一樣,MyBatis 同樣提供了一級緩存和二級緩存的支持

1.一級緩存:

基于PerpetualCache 的 HashMap本地緩存,其存儲作用域為 Session,當(dāng) Session flush 或 close 之后,該Session中的所有 Cache 就將清空。 

2. 二級緩存:

二級緩存與一級緩存其機(jī)制相同,默認(rèn)也是采用 PerpetualCache,HashMap存儲,不同在于其存儲作用域為 Mapper(Namespace),并且可自定義存儲源,如 Ehcache。

3. 對于緩存數(shù)據(jù)更新機(jī)制,當(dāng)某一個作用域(一級緩存Session/二級緩存Namespaces)的進(jìn)行了 C/U/D 操作后,默認(rèn)該作用域下所有 select 中的緩存將被clear。

1.1、Mybatis一級緩存測試

package me.gacl.test;import me.gacl.domain.User;import me.gacl.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import org.junit.Test;/*** @author gacl* 測試一級緩存*/public class TestOneLevelCache {/** 一級緩存: 也就Session級的緩存(默認(rèn)開啟)*/@Testpublic void testCache() {SqlSession session = MyBatisUtil.getSqlSession();String statement = "me.gacl.mapping.userMapper.getUser";User user = session.selectOne(statement, );System.out.println(user);/** 一級緩存默認(rèn)就會被使用*/user = session.selectOne(statement, );System.out.println(user);session.close();/*. 必須是同一個Session,如果session對象已經(jīng)close()過了就不可能用了 */session = MyBatisUtil.getSqlSession();user = session.selectOne(statement, );System.out.println(user);/*. 查詢條件是一樣的*/user = session.selectOne(statement, );System.out.println(user);/*. 沒有執(zhí)行過session.clearCache()清理緩存*///session.clearCache(); user = session.selectOne(statement, );System.out.println(user);/*. 沒有執(zhí)行過增刪改的操作(這些操作都會清理緩存)*/session.update("me.gacl.mapping.userMapper.updateUser",new User(, "user", ));user = session.selectOne(statement, );System.out.println(user);}} 

1.2、Mybatis二級緩存測試

  1、開啟二級緩存,在userMapper.xml文件中添加如下配置

<mapper namespace="me.gacl.mapping.userMapper"><!-- 開啟二級緩存 --><cache/> 

  2、測試二級緩存

package me.gacl.test;import me.gacl.domain.User;import me.gacl.util.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.junit.Test;/*** @author gacl* 測試二級緩存*/public class TestTwoLevelCache {/** 測試二級緩存* 使用兩個不同的SqlSession對象去執(zhí)行相同查詢條件的查詢,第二次查詢時不會再發(fā)送SQL語句,而是直接從緩存中取出數(shù)據(jù)*/@Testpublic void testCache() {String statement = "me.gacl.mapping.userMapper.getUser";SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();//開啟兩個不同的SqlSessionSqlSession session = factory.openSession();SqlSession session = factory.openSession();//使用二級緩存時,User類必須實現(xiàn)一個Serializable接口===> User implements SerializableUser user = session.selectOne(statement, );session.commit();//不懂為啥,這個地方一定要提交事務(wù)之后二級緩存才會起作用System.out.println("user="+user);//由于使用的是兩個不同的SqlSession對象,所以即使查詢條件相同,一級緩存也不會開啟使用user = session.selectOne(statement, );//session.commit();System.out.println("user="+user);}} 

1.3、二級緩存補(bǔ)充說明

  1. 映射語句文件中的所有select語句將會被緩存。

  2. 映射語句文件中的所有insert,update和delete語句會刷新緩存。

  3. 緩存會使用Least Recently Used(LRU,最近最少使用的)算法來收回。

  4. 緩存會根據(jù)指定的時間間隔來刷新。

  5. 緩存會存儲1024個對象

cache標(biāo)簽常用屬性:

<cache eviction="FIFO" <!--回收策略為先進(jìn)先出-->flushInterval="60000" <!--自動刷新時間60s-->size="512" <!--最多緩存512個引用對象-->readOnly="true"/> <!--只讀-->

給大家補(bǔ)充點知識:

和hibernate一樣,mybatis也有緩存機(jī)制

一級緩存是基于 PerpetualCache(mybatis自帶)的 HashMap 本地緩存,作用范圍為session,所以當(dāng)session commit或close后,緩存就會被清空

二級緩存默認(rèn)也是基于 PerpetualCache,但是可以為其制定存儲源,比如ehcache

一級緩存緩存的是SQL語句,而二級緩存緩存的是結(jié)果對象,看如下例子(mybatis的日志級別設(shè)為debug)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 闻喜县| 洪江市| 城固县| 紫金县| 滨海县| 宁远县| 西畴县| 同江市| 尼玛县| 扎赉特旗| 乐陵市| 梁河县| 广饶县| 漳州市| 巩义市| 南陵县| 上犹县| 五台县| 金阳县| 周口市| 四子王旗| 开平市| 深州市| 衡东县| 玛纳斯县| 休宁县| 涞源县| 凌源市| 彭山县| 静海县| 蛟河市| 扎赉特旗| 虹口区| 湘阴县| 辰溪县| 台州市| 岐山县| 营山县| 清水河县| 中宁县| 安新县|