亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2016年05月24日 15:34:47   作者:孤傲蒼狼  
MyBatis緩存分為一級緩存和二級緩存一級緩存,本文給大家介紹mybatis緩存知識,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧

一、MyBatis緩存介紹

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

1.一級緩存:

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

2. 二級緩存:

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

3. 對于緩存數(shù)據(jù)更新機(jī)制,當(dāng)某一個(gè)作用域(一級緩存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)開啟)
*/
@Test
public 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();
/*
. 必須是同一個(gè)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 {
/*
* 測試二級緩存
* 使用兩個(gè)不同的SqlSession對象去執(zhí)行相同查詢條件的查詢,第二次查詢時(shí)不會再發(fā)送SQL語句,而是直接從緩存中取出數(shù)據(jù)
*/
@Test
public void testCache() {
String statement = "me.gacl.mapping.userMapper.getUser";
SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
//開啟兩個(gè)不同的SqlSession
SqlSession session = factory.openSession();
SqlSession session = factory.openSession();
//使用二級緩存時(shí),User類必須實(shí)現(xiàn)一個(gè)Serializable接口===> User implements Serializable
User user = session.selectOne(statement, );
session.commit();//不懂為啥,這個(gè)地方一定要提交事務(wù)之后二級緩存才會起作用
System.out.println("user="+user);
//由于使用的是兩個(gè)不同的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ù)指定的時(shí)間間隔來刷新。

  5. 緩存會存儲1024個(gè)對象

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

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

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

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

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

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

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

相關(guān)文章

  • 徹底了解java中ReentrantLock和AQS的源碼

    徹底了解java中ReentrantLock和AQS的源碼

    這篇文章主要介紹了徹底了解java中ReentrantLock和AQS的源碼,想了解鎖機(jī)制的同學(xué),一定要參考下
    2021-04-04
  • SpringBoot中使用Guava實(shí)現(xiàn)單機(jī)令牌桶限流的示例

    SpringBoot中使用Guava實(shí)現(xiàn)單機(jī)令牌桶限流的示例

    本文主要介紹了SpringBoot中使用Guava實(shí)現(xiàn)單機(jī)令牌桶限流的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(1)

    java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(1)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • XML解析四種方式代碼示例詳解

    XML解析四種方式代碼示例詳解

    這篇文章主要介紹了XML解析四種方式代碼示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java中執(zhí)行docker命令的實(shí)現(xiàn)示例

    Java中執(zhí)行docker命令的實(shí)現(xiàn)示例

    本文主要介紹了Java中執(zhí)行docker命令的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Java中ConcurrentHashMap是如何實(shí)現(xiàn)線程安全

    Java中ConcurrentHashMap是如何實(shí)現(xiàn)線程安全

    ConcurrentHashMap是一個(gè)哈希表,支持檢索的全并發(fā)和更新的高預(yù)期并發(fā)。本文主要介紹了Java中ConcurrentHashMap是如何實(shí)現(xiàn)線程安全,感興趣的可以了解一下
    2021-11-11
  • SpringBoot整合mybatis常見問題(小結(jié))

    SpringBoot整合mybatis常見問題(小結(jié))

    這篇文章主要介紹了SpringBoot整合mybatis常見問題(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java開發(fā)接口吞吐量提升10多倍技巧

    java開發(fā)接口吞吐量提升10多倍技巧

    這篇文章主要為大家介紹了java開發(fā)技巧之接口吞吐量提升10多倍的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Java中PriorityQueue實(shí)現(xiàn)最小堆和最大堆的用法

    Java中PriorityQueue實(shí)現(xiàn)最小堆和最大堆的用法

    很多時(shí)候都會遇到PriorityQueue,本文主要介紹了Java中PriorityQueue實(shí)現(xiàn)最小堆和最大堆的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java實(shí)現(xiàn)多數(shù)據(jù)源的幾種方式總結(jié)

    Java實(shí)現(xiàn)多數(shù)據(jù)源的幾種方式總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于Java實(shí)現(xiàn)多數(shù)據(jù)源的幾種方式,最近項(xiàng)目中的工作流需要查詢多個(gè)數(shù)據(jù)源的數(shù)據(jù),數(shù)據(jù)源可能是不同種類的,需要的朋友可以參考下
    2023-08-08

最新評論