激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人国产精品一区二区毛片在线 | 精品久久久久久久久久久下田 | 91美女视频在线观看 | 国产毛片在线看 | 康妮卡特欧美精品一区 | 亚洲欧洲日产v特级毛片 | 国产乱淫av片免费观看 | 欧美一区二区三区免费电影 | gogo全球大胆高清人露出91 | 成人午夜一区 | av免费在线免费观看 | 懂色av懂色aⅴ精彩av | 久久毛片 | 嗯~啊~用力~高h | 爽爽淫人综合网网站 | 久久精品成人免费国产片桃视频 | 国产精品99一区二区 | 国产精品视频一区二区三区综合 | 成人国产精品色哟哟 | 欧美精品电影一区 | 9999久久久久久 | 亚洲视频在线视频 | 一区二区三区日韩 | 亚洲美女网站在线观看 | 亚洲精品毛片一区二区三区 | av在线官网 | 亚洲一区在线观看视频 | 精品一区二区免费视频视频 | 黄色网址免费进入 | 日日草夜夜操 | 成人免费一区二区三区在线观看 | 久久久无码精品亚洲日韩按摩 | 国产高清自拍一区 | 免费一级肉体全黄毛片 | 日本一区二区免费在线播放 | 海外中文字幕在线观看 | 国产精品久久亚洲 | 免费一级毛片电影 | 久久91精品久久久久清纯 | 成年性羞羞视频免费观看 | 成人做爽爽爽爽免费国产软件 |