摘要:一級(jí)緩存對(duì)于一級(jí)緩存來說是直接單個(gè)線程隔離的在執(zhí)行的時(shí)候會(huì)自動(dòng)清空緩存避免臟讀造成的影響此時(shí)為線程隔離的而管理對(duì)象為所有線程所共享的修改展示層獲取開始時(shí)間獲取結(jié)束時(shí)間查看日志可以看到只查
一級(jí)緩存
對(duì)于一級(jí)緩存來說,Mybatis是直接單個(gè)線程隔離的
在執(zhí)行add,update,delete 的時(shí)候,會(huì)自動(dòng)清空緩存,避免臟讀造成的影響
此時(shí)mapper為線程隔離的,而管理對(duì)象為所有線程所共享的.
修改展示層
<%@ page import="org.apache.ibatis.session.SqlSession" %> <%@ page import="com.ming.Util.SqlSessionFactoryUtil" %> <%@ page import="com.ming.MyBatis.RoleMapper" %> <%@ page import="java.util.List" %> <%@ page import="java.util.Iterator" %> <%@ page import="com.ming.MyBatis.POJO.Student" %>Hello World!
<% long startTime = System.currentTimeMillis(); //獲取開始時(shí)間 SqlSession sqlSession = null; Liststudents = null; List students1 = null; try { sqlSession = SqlSessionFactoryUtil.openSqlSesion(); RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class); students = roleMapper.getStudent(1); students1 = roleMapper.getStudent(1); sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); sqlSession.rollback(); } finally { if (sqlSession != null) { sqlSession.close(); } } long endTime = System.currentTimeMillis(); //獲取結(jié)束時(shí)間 %> <% Iterator iterator = students.iterator(); while(iterator.hasNext()){ %> <%=((Student)iterator.next()).getGender()%> <% } iterator = students1.iterator(); while(iterator.hasNext()){ %> <%=((Student)iterator.next()).getGender()%> <% } %>
查看日志
2019-04-17 22:33:38.147 [DEBUG] org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:136) - Opening JDBC Connection 2019-04-17 22:33:38.147 [DEBUG] org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:397) - Checked out connection 879027360 from pool. 2019-04-17 22:33:38.148 [DEBUG] org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:100) - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3464e4a0] 2019-04-17 22:33:38.161 [DEBUG] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) - ==> Preparing: SELECT student.uid, student.gender, student.remarks, student.student_id_number, student.student_name FROM student WHERE student.uid = 1; 2019-04-17 22:33:38.162 [DEBUG] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) - ==> Parameters: 2019-04-17 22:33:38.181 [DEBUG] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) - <== Total: 1 2019-04-17 22:33:38.183 [DEBUG] org.apache.ibatis.transaction.jdbc.JdbcTransaction.resetAutoCommit(JdbcTransaction.java:122) - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3464e4a0] 2019-04-17 22:33:38.200 [DEBUG] org.apache.ibatis.transaction.jdbc.JdbcTransaction.close(JdbcTransaction.java:90) - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3464e4a0] 2019-04-17 22:33:38.201 [DEBUG] org.apache.ibatis.datasource.pooled.PooledDataSource.pushConnection(PooledDataSource.java:362) - Returned connection 879027360 to pool.
可以看到只查詢了一次
需要注意的是緩存在各個(gè)SqlSession是相互隔離的
二級(jí)緩存二級(jí)緩存直接添加cache即可
此時(shí)select語句將會(huì)緩存
insert update delete 將會(huì)刷新緩存
會(huì)使用LRU算法進(jìn)行回收
根據(jù)時(shí)間表 緩存不會(huì)用任何時(shí)間順序來刷新緩存
緩存會(huì)存儲(chǔ)列表集合或?qū)ο?1024個(gè)引用
由于對(duì)象需要序列化所以需要實(shí)現(xiàn) java.io.Serializable接口
父類實(shí)現(xiàn)序列化 子類會(huì)自動(dòng)實(shí)現(xiàn)序列化 若子類實(shí)現(xiàn)序列化 父類沒有實(shí)現(xiàn)序列化 此時(shí)在子類中保存父類的值,直接跳過
2019-04-18 00:55:44.428 [DEBUG] org.apache.ibatis.cache.decorators.LoggingCache.getObject(LoggingCache.java:62) - Cache Hit Ratio [com.ming.MyBatis.RoleMapper]: 0.7586206896551724 2019-04-18 00:55:44.430 [DEBUG] org.apache.ibatis.cache.decorators.LoggingCache.getObject(LoggingCache.java:62) - Cache Hit Ratio [com.ming.MyBatis.RoleMapper]: 0.7666666666666667 2019-04-18 00:55:44.433 [DEBUG] org.apache.ibatis.cache.decorators.LoggingCache.getObject(LoggingCache.java:62) - Cache Hit Ratio [com.ming.MyBatis.RoleMapper]: 0.7741935483870968 2019-04-18 00:55:44.435 [DEBUG] org.apache.ibatis.cache.decorators.LoggingCache.getObject(LoggingCache.java:62) - Cache Hit Ratio [com.ming.MyBatis.RoleMapper]: 0.78125
查看日志,可以發(fā)現(xiàn)再次讀取的時(shí)候,直接從緩存中獲取了.
緩存生效,并為執(zhí)行sql語句
已經(jīng)命中緩存
自定義緩存這個(gè)需要實(shí)現(xiàn)cache接口
package com.ming.MyBatis; import java.util.concurrent.locks.ReadWriteLock; /** * @author ming */ public class Cache implements org.apache.ibatis.cache.Cache { /** * @return The identifier of this cache */ @Override public String getId() { return null; } /** * @param key Can be any object but usually it is a {@link CacheKey} * @param value The result of a select. */ @Override public void putObject(Object key, Object value) { } /** * @param key The key * @return The object stored in the cache. */ @Override public Object getObject(Object key) { return null; } /** * As of 3.3.0 this method is only called during a rollback * for any previous value that was missing in the cache. * This lets any blocking cache to release the lock that * may have previously put on the key. * A blocking cache puts a lock when a value is null * and releases it when the value is back again. * This way other threads will wait for the value to be * available instead of hitting the database. * * @param key The key * @return Not used */ @Override public Object removeObject(Object key) { return null; } /** * Clears this cache instance. */ @Override public void clear() { } /** * Optional. This method is not called by the core. * * @return The number of elements stored in the cache (not its capacity). */ @Override public int getSize() { return 0; } /** * Optional. As of 3.2.6 this method is no longer called by the core. ** Any locking needed by the cache must be provided internally by the cache provider. * * @return A ReadWriteLock */ @Override public ReadWriteLock getReadWriteLock() { return null; } }
然后redis直接操作即可
額...暫時(shí)先不連接
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74190.html
摘要:一級(jí)緩存值得注意的地方默認(rèn)就是支持一級(jí)緩存的,并不需要我們配置和整合后進(jìn)行代理開發(fā),不支持一級(jí)緩存,和整合,按照的模板去生成代理對(duì)象,模板中在最后統(tǒng)一關(guān)閉??偨Y(jié)的一級(jí)緩存是級(jí)別的。 前言 本文主要講解Mybatis的以下知識(shí)點(diǎn): Mybatis緩存 一級(jí)緩存 二級(jí)緩存 與Ehcache整合 Mapper代理 使用Mapper代理就不用寫實(shí)現(xiàn)類了 逆向工程 自動(dòng)生成代碼 ...
摘要:得到用戶信息,將用戶信息存儲(chǔ)到一級(jí)緩存中。如果中間去執(zhí)行操作執(zhí)行插入更新刪除,則會(huì)清空中的一級(jí)緩存,這樣做的目的為了讓緩存中存儲(chǔ)的是最新的信息,避免臟讀。 基礎(chǔ): 1、 概念:Java當(dāng)中的一個(gè)持久層框架。2、 特點(diǎn)、優(yōu)勢(shì):(1)把java代碼和SQL代碼做了一個(gè)完全分離。(2)良好支持復(fù)雜對(duì)象的映射(輸入映射、輸出映射)(3)使用動(dòng)態(tài)SQL,可以預(yù)防SQL注入。3、 ...
摘要:緩存介紹正如大多數(shù)持久層框架一樣,同樣提供了一級(jí)緩存和二級(jí)緩存的支持一級(jí)緩存基于的本地緩存,其存儲(chǔ)作用域?yàn)?,?dāng)或之后,該中的所有就將清空。一級(jí)緩存實(shí)現(xiàn)對(duì)的操作內(nèi)部都是通過來執(zhí)行的。 MyBatis緩存介紹 正如大多數(shù)持久層框架一樣,MyBatis 同樣提供了一級(jí)緩存和二級(jí)緩存的支持 一級(jí)緩存: 基于PerpetualCache 的 HashMap本地緩存,其存儲(chǔ)作用域?yàn)?Se...
摘要:本文章的源碼再文章末尾什么是查詢緩存有一級(jí)緩存和二級(jí)緩存。默認(rèn)開啟一級(jí)緩存。證明了一級(jí)緩存只是在數(shù)據(jù)庫會(huì)話內(nèi)部共享的。但是,整合到中后,一級(jí)緩存就會(huì)被關(guān)閉。根據(jù)時(shí)間表比如沒有刷新間隔緩存不會(huì)以任何時(shí)間順序來刷新。 倉(cāng)庫地址:spring-boot-learning歡迎star、fork,給作者一些鼓勵(lì) 學(xué)習(xí)SpringBoot集成Mybatis的第二章,了解到Mybatis自帶的緩存機(jī)...
摘要:本文章的源碼再文章末尾什么是查詢緩存有一級(jí)緩存和二級(jí)緩存。默認(rèn)開啟一級(jí)緩存。證明了一級(jí)緩存只是在數(shù)據(jù)庫會(huì)話內(nèi)部共享的。但是,整合到中后,一級(jí)緩存就會(huì)被關(guān)閉。根據(jù)時(shí)間表比如沒有刷新間隔緩存不會(huì)以任何時(shí)間順序來刷新。 倉(cāng)庫地址:spring-boot-learning歡迎star、fork,給作者一些鼓勵(lì) 學(xué)習(xí)SpringBoot集成Mybatis的第二章,了解到Mybatis自帶的緩存機(jī)...
閱讀 1596·2021-10-25 09:44
閱讀 2969·2021-09-04 16:48
閱讀 1616·2019-08-30 15:44
閱讀 2537·2019-08-30 15:44
閱讀 1760·2019-08-30 15:44
閱讀 2851·2019-08-30 14:14
閱讀 2995·2019-08-30 13:00
閱讀 2181·2019-08-30 11:09