91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Mybatis的一級緩存和二級緩存

發布時間:2022-02-23 13:50:07 來源:億速云 閱讀:245 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“如何實現Mybatis的一級緩存和二級緩存”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何實現Mybatis的一級緩存和二級緩存”這篇文章吧。

mybatis緩存

mybatis作為一個流行的持久化工具,緩存必然是缺少不了的組件。通過這篇文章,就讓我們來了解一下mybatis的緩存。

mybatis緩存類型

說起mybatis的緩存,了解過的同學都知道,mybatis中可以有兩種緩存類型:

  • 第一種,我們通常稱為以及緩存,或者sqlSession級別的緩存,這種緩存是mybatis自帶的,如果mapper中的配置都是默認的話,那么一級緩存也是默認開啟的。

  • 第二種,就是非sqlSession級別的緩存了,我們通常稱為二級緩存,mybatis中的二級緩存需要實現Cache接口,并且配置在mapper中,要先開啟的話,需要一些配置,下面我們會詳細說到。

一級緩存

作為mybatis自帶的緩存,我們通過代碼來分析一下其原理。
首先,我們來看下一級緩存的效果。
測試代碼:

@Test
public void test_Cache() throws Exception {
    InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input);
    SqlSession sqlSession = factory.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    System.out.println("the first query : ");
    mapper.queryAllUsers();
    System.out.println("====================================");
    System.out.println("the second query : ");
    mapper.queryAllUsers();
    sqlSession.commit();
}

mapper配置如下,我們采用默認配置:

<select id="queryAllUsers" resultType="User">
    select * from hwc_users
</select>

運行結果如下:

Created connection 1191654595.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]
==> Preparing: select * from hwc_users
==> Parameters:
<== Columns: id, name, age, email
<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn
<== Total: 9
====================================
the second query :
Cache Hit Ratio [com.huwc.mapper.UserMapper]: 0.0

Process finished with exit code 0

從上述結果可以看到,第二次查詢并沒有從數據庫獲取,并且沒有從二級緩存中獲取,由此可見,默認配置情況下,同一個sqlSession中會默認使用mybatis的一級緩存。

下面,我們從mybatis源碼來看一下:

如何實現Mybatis的一級緩存和二級緩存

從上面的代碼中,我們可以看到:一級緩存是在BaseExecutor中命中的,BaseExecutor中的localCache屬性應該就是用來存儲查詢結果的。

localCache的定義代碼如下:

如何實現Mybatis的一級緩存和二級緩存

如何實現Mybatis的一級緩存和二級緩存

從上述代碼可以看出:

BaseExecutor中集成了一級緩存,一級緩存為PerpetualCache(永久緩存?)的對象,其也是實現了Cache接口的對象,并且其存儲結果就是簡單的HashMap。
并且從代碼上來看,一級緩存是無法禁止的。但是如果一個查詢,我們就是不想讓其從緩存中獲取,必須從數據庫查詢,那我們豈不是無法處理了?
答案必然是否定的,我們從代碼中可以看到:雖然一級緩存無法跳過,但是我們可以將緩存中數據進行清除處理,這樣一級緩存中就獲取不到結果集了:

如何實現Mybatis的一級緩存和二級緩存

如何讓mybatis每次查詢都flush緩存結果集呢?答案是通過mapper配置中的flushCache屬性來處理:

<select id="queryAllUsers" resultType="User" flushCache="true">
    select * from hwc_users
</select>

加上這個屬性后,我們來看下程序執行結果:

Created connection 1191654595.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]
==> Preparing: select * from hwc_users
==> Parameters:
<== Columns: id, name, age, email
<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn
<== Total: 9
====================================
the second query :
Cache Hit Ratio [com.huwc.mapper.UserMapper]: 0.0
==> Preparing: select * from hwc_users
==> Parameters:
<== Columns: id, name, age, email
<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn
<== Total: 9

Process finished with exit code 0

可以看到,第二次查詢也檢索了數據庫來獲取結果。
一級緩存就說到這里吧,下面我們來看看二級緩存。

二級緩存

mybatis的二級緩存是需要借助第三方的緩存來實現,常用的有ehcache或者redis,其存儲類型不同,但是在mybatis中的使用方式是一樣的,簡單處理,我們使用ehcache來說明。
通常來說,在mybatis中啟用二級緩存,我們需要以下的步驟:

1、在項目中引入ehcache模塊和mybatis-ehcache模塊

2、在項目中加如ehcache配置文件

3、在mybatis配置文件中我們需要在setting中配置cacheEnabled屬性;

4、在mapper配置文件中配置cache屬性,并指定緩存的實現類;

5、在statement中配置useCache屬性為”true“

第一步:首先我們在項目中引入相關模塊:

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>2.10.0</version>
</dependency>
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>

第二步:我們從網上抄一個ehcache的配置文件:ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
    <diskStore path="java.io.tmpdir"/>
    <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
                  timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>
</ehcache>

第三步:配置mybatis屬性

<setting name="cacheEnabled" value="true"/>

之前,我們說過,mybatis的配置,主要是為了初始化Configuration對象,從Configuration代碼中我們看到,對應的屬性默認值就是為true,因此,此步驟也可以跳過,直接采用mybatis的默認值:

如何實現Mybatis的一級緩存和二級緩存

第四步:配置mapper中的緩存屬性:

<mapper namespace="com.huwc.mapper.UserMapper">
    <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
    ......
</mapper>

第五步:在statement中開啟二級緩存:

<select id="queryAllUsers" resultType="User" useCache="true">
    select * from hwc_users
</select>

測試代碼如下,為了屏蔽一級緩存,我們在第一次查詢和第二次查詢中將sqlSession進行關閉并重新open:

@Test
public void test_Cache() throws Exception {
    InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(input);
    SqlSession sqlSession = factory.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    System.out.println("the first query : ");
    mapper.queryAllUsers();
    sqlSession.close();
    sqlSession = factory.openSession();
    mapper = sqlSession.getMapper(UserMapper.class);
    System.out.println("====================================");
    System.out.println("the second query : ");
    mapper.queryAllUsers();
    sqlSession.commit();
}

執行結果如下:

Created connection 1191654595.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]
==> Preparing: select * from hwc_users
==> Parameters:
<== Columns: id, name, age, email
<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn
<== Total: 9
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]
Returned connection 1191654595 to pool.
====================================
the second query :
Cache Hit Ratio [com.huwc.mapper.UserMapper]: 0.5

Process finished with exit code 0

從結果中,我們可以看到,二級緩存起到了作用,并且命中率為0.5(查詢兩次,一次命中)

下面,我們從mybatis的代碼來看下二級緩存使用:

如何實現Mybatis的一級緩存和二級緩存

代碼截圖中,我們看到,二級緩存是在CacheExecutor中進行的調用,并且最終使用的就是我們的Ehcache:

如何實現Mybatis的一級緩存和二級緩存

并且,如果我們在mapper中的statement中也配置了flushCache,那么二級緩存也將在查詢前被清除掉,我們通過測試來看以下:

<select id="queryAllUsers" resultType="User" flushCache="true" useCache="true">
    select * from hwc_users
</select>

執行結果如下:

Created connection 1191654595.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]
==> Preparing: select * from hwc_users
==> Parameters:
<== Columns: id, name, age, email
<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn
<== Total: 9
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]
Returned connection 1191654595 to pool.
====================================
the second query :
Cache Hit Ratio [com.huwc.mapper.UserMapper]: 0.5
Opening JDBC Connection
Checked out connection 1191654595 from pool.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@470734c3]
==> Preparing: select * from hwc_users
==> Parameters:
<== Columns: id, name, age, email
<== Row: 1, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 2, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 3, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 4, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 5, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 6, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 7, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 8, 胡文超, 35, huwenchao@cheryfs.cn
<== Row: 9, 胡文超, 35, huwenchao@cheryfs.cn
<== Total: 9

Process finished with exit code 0

總結:

1、mybatis的緩存處理,都交由Executor來處理,一級緩存是由BaseExecutor處理,二級緩存則由CacheExecutor處理;

2、statement中如果配置了flushCache為true,那么不論是一級緩存還是二級緩存都會失效;

3、要啟用二級緩存,需要在statement中配置useCache為true。

以上是“如何實現Mybatis的一級緩存和二級緩存”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

甘孜县| 河南省| 宁陵县| 大同县| 磴口县| 永胜县| 康定县| 新建县| 双峰县| 称多县| 朝阳县| 英德市| 绿春县| 昔阳县| 高密市| 康保县| 孟津县| 郴州市| 宾川县| 神木县| 壤塘县| 镇雄县| 岐山县| 库尔勒市| 新竹市| 甘肃省| 乌鲁木齐市| 崇阳县| 峨眉山市| 竹山县| 泽州县| 会东县| 浮梁县| 深水埗区| 枣庄市| 恭城| 莱西市| 平泉县| 潜江市| 祥云县| 卢湾区|