一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - mybatis中的緩存問題解析

mybatis中的緩存問題解析

2020-09-11 10:50_江南一點雨 Java教程

本篇文章主要介紹了mybatis中的緩存問題解析,詳細的介紹了關于mybatis的一級緩存和二級緩存,具有一定的參考價值,有興趣的可以了解一下。

關于mybatis基礎我們前面幾篇博客已經介紹了很多了,今天我們來說一個簡單的問題,那就是mybatis中的緩存問題。mybatis本身對緩存提供了支持,但是如果我們沒有進行任何配置,那么默認情況下系統只開啟了一級緩存,一級緩存就是同一個sqlsession執行的相同查詢是會進行緩存的,ok,那么今天我們就來看看這些緩存,并簡單驗證下。

系統默認開啟了一級緩存

這個緩存系統默認情況下是開啟的,當我們獲取到一個sqlsession對象之后,如果調用sqlsession中的同一個方法查詢同一條數據,那么第二次查詢將不會去數據庫中查詢,因為第一次查詢有緩存,直接調用緩存數據即可,除非緩存超時或者我們明確聲明數據要刷新,否則都是直接調用緩存數據。ok,我們來看一個簡單的案例。
查詢代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sqlsession sqlsession = null;
    try {
      sqlsession = dbutils.opensqlsession();
      usermapper mapper = sqlsession.getmapper(usermapper.class);
      //查詢同一條數據時會緩存
      user user = mapper.getuser(1l);
      user user2 = mapper.getuser(1l);
      system.out.println(user.tostring());
      system.out.println(user2.tostring());
      sqlsession.commit();
    } catch (exception e) {
      system.err.println(e.getmessage());
      sqlsession.rollback();
    } finally {
      if (sqlsession != null) {
        sqlsession.close();
      }
    }

我們來看看日志:

mybatis中的緩存問題解析

小伙伴們看到,我這里執行了兩次查詢,但實際上只執行了一次sql語句。

自己配置二級緩存

上面的緩存是由系統默認配置的,這個有一定的局限性,就是只能在同一個sqlsession中有效,脫離了同一個sqlsession就沒法使用這個緩存了,有的時候我們可能希望能夠跨sqlsession進行數據緩存。那么這個時候需要我們進行手動開啟二級緩存。

二級緩存的開啟方式其實很簡單,只需要我們在usermapper.xml中配置<cache/>節點即可。如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8" ?>
<!doctype mapper
public "-//mybatis.org//dtd mapper 3.0//en"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.sang.db.usermapper">
  <cache/>
  <select id="getuser" resulttype="org.sang.bean.user" parametertype="long">
    select * from user where id = #{id}
  </select>
  <insert id="insertuser" parametertype="org.sang.bean.user">
    insert into user(username,password,address) values (#{username},#{password},#{address})
  </insert>
  <delete id="deleteuser" parametertype="long">
    delete from user where id=#{id}
  </delete>
  <select id="getall" resulttype="u">
    select * from user
  </select>
</mapper>

這樣簡單配置之后,二級緩存就算開啟了,這樣的配置中,許多東西都是默認的,比如所有的select語句都會被緩存,所有的delete、insert和update則都會將緩存刷新,還比如緩存將使用lru算法進行內存回收等。那么這些東西如果需要配置的話,我們可以按如下方式進行配置:

<cache eviction="lru" flushinterval="20000" size="1024" readonly="true"/>,這里的eviction表示緩存策略,除了lru之外還有先進先出(fifo)、軟引用(soft)、弱引用(weak)等,flushinterval則表示刷新時間,表示緩存的對象個數,readonly為true則表示緩存只可以讀取不可以修改。

ok,做了如上配置之后還不夠,開啟二級緩存還要求我們的實體類可以序列化,實現serializable接口即可,如下:

?
1
2
3
4
5
6
7
8
9
public class user implements serializable{
  private long id;
  private string username;
  private string password;
  private string address;
 
  ...
 
}

如此之后,我們的二級緩存就算成功開啟了,ok,我么來測試下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sqlsession sqlsession = null;
    sqlsession sqlsession2 = null;
    try {
      sqlsession = dbutils.opensqlsession();
      usermapper mapper = sqlsession.getmapper(usermapper.class);
      user user = mapper.getuser(1l);
      system.out.println(user.tostring());
      sqlsession.commit();
      sqlsession2 = dbutils.opensqlsession();
      usermapper mapper2 = sqlsession2.getmapper(usermapper.class);
      user user2 = mapper2.getuser(1l);
      system.out.println(user2.tostring());
      sqlsession2.commit();
    } catch (exception e) {
      system.err.println(e.getmessage());
      sqlsession.rollback();
      sqlsession2.rollback();
    } finally {
      if (sqlsession != null) {
        sqlsession.close();
      }
      if (sqlsession2 != null) {
        sqlsession2.close();
      }
    }

打印日志如下:

mybatis中的緩存問題解析

ok,小伙伴們看到sql語句實際上只執行了一次。

ok,以上就是對mybatis中緩存的一個簡單介紹。

本文案例下載: 本文案例github地址https://github.com/lenve/javaeetest/tree/master/test27-mybatis8

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/u012702547/article/details/55051908

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩欧美一区黑人vs日本人 | 国产区香蕉精品系列在线观看不卡 | 精品一区二区三区色花堂 | 大胆私拍模特国模377 | 欧美贵妇videos办公室 | 护士被多人调教到失禁h | 动漫肉在线观看 | 高h巨肉play| 国产麻豆传媒在线观看 | 日本加勒比在线精品视频 | 黑人巨摘花第一次出血 | 国产高清在线精品一区二区三区 | 欧美草逼网站 | 久久国产精品高清一区二区三区 | 2021国产麻豆剧传媒新片 | 成人快插 | 美女在线看永久免费网址 | 韩剧在线观看 | 亚洲另类老妇videos | 91免费播放人人爽人人快乐 | 午夜视频一区二区三区 | 天天性综合 | 男女被爆动漫羞羞动漫 | 久久久久国产一级毛片高清片 | 日日操美女 | 国产美女在线一区二区三区 | 国产区一二三四区2021 | 高清女主播一区二区三区 | 9420高清完整版在线观看国语 | 色吧五月婷婷 | 国内精品在线观看视频 | 久久热r在线视频精品 | 亚洲色图2 | 国内会所按摩推拿国产 | 韩国三级视频网站 | 久久人妻无码毛片A片麻豆 久久热这里只有 精品 | 国产一精品一av一免费爽爽 | 日本中文字幕在线视频 | 国产高清在线观看 | 成年人免费看的视频 | 国产99er66在线视频 |