關于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(); } } |
我們來看看日志:
小伙伴們看到,我這里執行了兩次查詢,但實際上只執行了一次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(); } } |
打印日志如下:
ok,小伙伴們看到sql語句實際上只執行了一次。
ok,以上就是對mybatis中緩存的一個簡單介紹。
本文案例下載: 本文案例github地址https://github.com/lenve/javaeetest/tree/master/test27-mybatis8
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/u012702547/article/details/55051908