⑴ mybatis的一級緩存
你好,你的想法是對的,應為以及緩存是依賴於sqlsession的,如果關閉session緩存將會消失。其實所謂的緩存就是map,他是以map集合來存儲數據的,而這個map就在session中的一個緩存方法當中。
⑵ mybatis具有緩存機制,除了增刪改之外
mybatis的緩存機制
mybatis的緩存分為一級緩存和二級緩存:
1 . mybatis的一級緩存是sqlsession級別的,是基於 HashMap 的本地緩存,不同的 SqlSession 之間的緩存數據區域互不影響。
MyBatis 默認開啟一級緩存。
2 . mybatis的耳機緩存是mapper級別,是基於 HashMap 的本地緩存,多個 SqlSession 可以共用二級緩存,其作用域是 mapper 的同一個 namespace (基本上可以理解一個mapper容器就是一個二級緩存)。
MyBatis 默認關閉二級緩存,如果要使用二級緩存需要在SqlMapConfig.xml文件中通過
<setting name="cacheEnabled" value="true"/>
標簽開啟二級緩的總開關,在需要使用二級緩存的mapper文件中 通過<cache />標簽,開啟這個mapper的二級緩存。
⑶ mybatis的緩存機制是怎麼樣的
你好
關於mybatis的緩存機制:
和其他持久層框架一樣,mybatis也提供了對緩存的支持--一級緩存和二級緩存;
一、緩存介紹
一級緩存:基於PerpetualCache的HashMap的本地緩存,一級緩存的作用域為sqlSession,當sqlSession被flush或close之後,當前sqlSession中的所有緩存都將被清空;
二級緩存:和一級緩存的機制相同,默認也是採用PerpetualCache的HashMap存儲,但二級緩存的作用域是mapper(namespace);
在mybatis的緩存機制中,當緩存(一級緩存的sqlSession/二級緩存的namespace)進行了增刪改的操作之後,當前select的所有數據緩存都將被清除;
總結
二級緩存與一級緩存區別,二級緩存的范圍更大,多個sqlSession可以共享一個UserMapper的二級緩存區域。UserMapper有一個二級緩存區域(按namespace分) ,其它mapper也有自己的二級緩存區域(按namespace分)。每一個namespace的mapper都有一個二緩存區域,兩個mapper的namespace如果相同,這兩個mapper執行sql查詢到數據將存在相同 的二級緩存區域中。
希望對你有幫助
⑷ mybatis的緩存有幾種
1、一級緩存
MyBatis默認開啟了一級緩存,一級緩存是在SqlSession 層面進行緩存的。即,同一個SqlSession ,多次調用同一個Mapper和同一個方法的同一個參數,只會進行一次資料庫查詢,然後把數據緩存到緩沖中,以後直接先從緩存中取出數據,不會直接去查資料庫。
但是不同的SqlSession對象,因為不用的SqlSession都是相互隔離的,所以相同的Mapper、參數和方法,他還是會再次發送到SQL到資料庫去執行,返回結果。
2、二級緩存
為了克服這個問題,需要開啟二級緩存,是的緩存zaiSqlSessionFactory層面給各個SqlSession 對象共享。默認二級緩存是不開啟的,需要手動進行配置。
<cache/>
如果這樣配置的話,很多其他的配置就會被默認進行,如:
映射文件所有的select 語句會被緩存
映射文件的所有的insert、update和delete語句會刷新緩存
緩存會使用默認的Least Recently Used(LRU,最近最少使用原則)的演算法來回收緩存空間
根據時間表,比如No Flush Interval,(CNFI,沒有刷新間隔),緩存不會以任何時間順序來刷新
緩存會存儲列表集合或對象(無論查詢方法返回什麼)的1024個引用
緩存會被視為是read/write(可讀/可寫)的緩存,意味著對象檢索不是共享的,而且可以很安全的被調用者修改,不幹擾其他調用者或縣城所作的潛在修改
- <cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>
eviction:緩存回收策略
- LRU:最少使用原則,移除最長時間不使用的對象
- FIFO:先進先出原則,按照對象進入緩存順序進行回收
- SOFT:軟引用,移除基於垃圾回收器狀態和軟引用規則的對象
- WEAK:弱引用,更積極的移除移除基於垃圾回收器狀態和弱引用規則的對象flushInterval:刷新時間間隔,單位為毫秒,這里配置的100毫秒。如果不配置,那麼只有在進行資料庫修改操作才會被動刷新緩存區
size:引用額數目,代表緩存最多可以存儲的對象個數
readOnly:是否只讀,如果為true,則所有相同的sql語句返回的是同一個對象(有助於提高性能,但並發操作同一條數據時,可能不安全),如果設置為false,則相同的sql,後面訪問的是cache的clone副本。
useCache配置
如果一條語句每次都需要最新的數據,就意味著每次都需要從資料庫中查詢數據,可以把這個屬性設置為false,如:
- <select id="selectAll" resultMap="BaseResultMap" useCache="false">
刷新緩存(就是清空緩存)
二級緩存默認會在insert、update、delete操作後刷新緩存,可以手動配置不更新緩存,如下:
- <update id="updateById" parameterType="User" flushCache="false" />
可以在開啟二級緩存時候,手動配置一些屬性
各個屬性意義如下:
可以在Mapper的具體方法下設置對二級緩存的訪問意願:
3、自定義緩存
自定義緩存對象,該對象必須實現 org.apache.ibatis.cache.Cache 介面
每次查詢資料庫前,MyBatis都會先在緩存中查找是否有該緩存對象。只有當調用了commit() 方法,MyBatis才會往緩存中寫入數據,數據記錄的鍵為數字編號+Mapper名+方法名+SQL語句+參數格式,值為返回的對象值。
⑸ mybatis的cache-ref怎麼使用
首先明確一點 cache-ref 只對二級緩存有效,沒有使用二級緩存時,這東西沒有意義。
以下說明只針對二級緩存。
當mybatis的當前命名空間存在DML的事務提交時,會使當前命名空間里的緩存失效,這樣在查詢時,會直接從資料庫拿到數據,並再次緩存。但是如果是多表連接查詢,如tableA join tableB,A表的DML操作在A的nameSpace,B表的DML操作在B的nameSpace,當B表在進行了數據修改時,不會使A表緩存失效,再使用tableA join tableB會直接從緩存中獲取數據,因為此時緩存沒有刷新,而且B表的數據也有變化,那麼此時讀取的就是臟數據。
此時就需要在B的nameSpace里使用<cache-ref namespace="A"/>,保證跟新B時,A的緩存也失效。再在A裡面執行 tableA join tableB時,會重新從資料庫里查詢最新數據。
⑹ mybatis自帶一級和二級緩存,為什麼還要用redis
總配置文件中,二級緩存也是開啟的,不需要設置
mapper級別的cache需要開啟,在對應的mapper.xml寫入
開啟本mapper的二級緩存
⑺ mybatis 怎麼禁止一級緩存
默認情況下,select語句總是使用緩存,但有些情況下,我們希望它總是刷新從而得到最新數據,看了下它的文檔,配置不起作用,對配置文件的
<settings>
<setting name="cacheEnabled" value="false"/>
</settings>
不起作用,對sql映射文件的
flushCache="true" useCache="false"
仍然不起作用,最後找到了徹底的辦法,調用SqlSession.clearCache(),問題解決。
⑻ mybatis一級緩存實際使用場景
可以這樣理解,有些時候我們會多次查詢一個表,比如表A中有個欄位AA1是代碼,實際內容存在字典表B中,在這里如果我要查詢表A中的多條數據,並且要顯示AA1的實際內容,需要聯查B,此時一級緩存就可以發揮作用了
⑼ mybatis怎麼實現局部緩存
1.1、Mybatis一級緩存測試
1 package me.gacl.test;
2
3 import me.gacl.domain.User;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.SqlSession;
6 import org.junit.Test;
7
8 /**
9 * @author gacl
10 * 測試一級緩存
11 */
12 public class TestOneLevelCache {
13
14 /*
15 * 一級緩存: 也就Session級的緩存(默認開啟)
16 */
17 @Test
18 public void testCache1() {
19 SqlSession session = MyBatisUtil.getSqlSession();
20 String statement = "me.gacl.mapping.userMapper.getUser";
21 User user = session.selectOne(statement, 1);
22 System.out.println(user);
23
24 /*
25 * 一級緩存默認就會被使用
26 */
27 user = session.selectOne(statement, 1);
28 System.out.println(user);
29 session.close();
30 /*
31 1. 必須是同一個Session,如果session對象已經close()過了就不可能用了
32 */
33 session = MyBatisUtil.getSqlSession();
34 user = session.selectOne(statement, 1);
35 System.out.println(user);
36
37 /*
38 2. 查詢條件是一樣的
39 */
40 user = session.selectOne(statement, 2);
41 System.out.println(user);
42
43 /*
44 3. 沒有執行過session.clearCache()清理緩存
45 */
46 //session.clearCache();
47 user = session.selectOne(statement, 2);
48 System.out.println(user);
49
50 /*
51 4. 沒有執行過增刪改的操作(這些操作都會清理緩存)
52 */
53 session.update("me.gacl.mapping.userMapper.updateUser",
54 new User(2, "user", 23));
55 user = session.selectOne(statement, 2);
56 System.out.println(user);
57
58 }
59 }
1.2、Mybatis二級緩存測試
1、開啟二級緩存,在userMapper.xml文件中添加如下配置
<mapper namespace="me.gacl.mapping.userMapper">
<!-- 開啟二級緩存 -->
<cache/>
2、測試二級緩存
1 package me.gacl.test;
2
3 import me.gacl.domain.User;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.SqlSession;
6 import org.apache.ibatis.session.SqlSessionFactory;
7 import org.junit.Test;
8
9 /**
10 * @author gacl
11 * 測試二級緩存
12 */
13 public class TestTwoLevelCache {
14
15 /*
16 * 測試二級緩存
17 * 使用兩個不同的SqlSession對象去執行相同查詢條件的查詢,第二次查詢時不會再發送SQL語句,而是直接從緩存中取出數據
18 */
19 @Test
20 public void testCache2() {
21 String statement = "me.gacl.mapping.userMapper.getUser";
22 SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
23 //開啟兩個不同的SqlSession
24 SqlSession session1 = factory.openSession();
25 SqlSession session2 = factory.openSession();
26 //使用二級緩存時,User類必須實現一個Serializable介面===> User implements Serializable
27 User user = session1.selectOne(statement, 1);
28 session1.commit();//不懂為啥,這個地方一定要提交事務之後二級緩存才會起作用
29 System.out.println("user="+user);
30
31 //由於使用的是兩個不同的SqlSession對象,所以即使查詢條件相同,一級緩存也不會開啟使用
32 user = session2.selectOne(statement, 1);
33 //session2.commit();
34 System.out.println("user2="+user);
35 }
36 }
1.3、二級緩存補充說明
1. 映射語句文件中的所有select語句將會被緩存。
2. 映射語句文件中的所有insert,update和delete語句會刷新緩存。
3. 緩存會使用Least Recently Used(LRU,最近最少使用的)演算法來收回。
4. 緩存會根據指定的時間間隔來刷新。
5. 緩存會存儲1024個對象
cache標簽常用屬性:
<cache
eviction="FIFO" <!--回收策略為先進先出-->
flushInterval="60000" <!--自動刷新時間60s-->
size="512" <!--最多緩存512個引用對象-->
readOnly="true"/> <!--只讀-->
⑽ mybatis 中如果sqlsession執行下面哪個操作並提交資料庫,mybatis不會清空一級緩
mybatis 中如果sqlsession執行下面哪個操作並提交資料庫,mybatis不會清空一級緩
緩存機制是為了減輕資料庫壓力,提高資料庫性能。 Mybatis查詢緩存分為一級緩存...不執行session.commit(),操作沒有提交到資料庫,此時Mybatis不會清空