Mybatis缓存

mybatis 插入数据,打开与关闭连接池的插入性能对比 mybatis 插入数据,打开与关闭连接池的插入性能对比 mybatis 插入数据,打开与关闭连接池的插入性能对比 立即下载
三、Mybatis缓存

1.一级缓存

1>. 什么是一级缓存? 为什么使用一级缓存?
每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。

在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,如果不采取一些措施的话,每一次查询都会查询一次数据库,
而我们在极短的时间内做了完全相同的查询,那么它们的结果极有可能完全相同,由于查询一次数据库的代价很大,这有可能造成很大的资源浪费。

为了解决这一问题,减少资源的浪费,MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,
当下次查询的时候,如果判断先前有个完全一样的查询,会直接从缓存中直接将结果取出,返回给用户,不需要再进行一次数据库查询了。

如下图所示,MyBatis会在一次会话的表示----一个SqlSession对象中创建一个本地缓存(local cache),对于每一次查询,
都会尝试根据查询的条件去本地缓存中查找是否在缓存中,如果在缓存中,就直接从缓存中取出,然后返回给用户;
否则,从数据库读取数据,将查询结果存入缓存并返回给用户。



对于会话(Session)级别的数据缓存,我们称之为一级数据缓存,简称一级缓存

2>. MyBatis中的一级缓存是怎样组织的?(即SqlSession中的缓存是怎样组织的?)
由于MyBatis使用SqlSession对象表示一次数据库的会话,那么,对于会话级别的一级缓存也应该是在SqlSession中控制的。

SqlSession只是一个MyBatis对外的接口,SqlSession将它的工作交给了Executor执行器这个角色来完成,负责完成对数据库的各种操作。
当创建了一个SqlSession对象时,MyBatis会为这个SqlSession对象创建一个新的Executor执行器,而缓存信息就被维护在这个Executor执行器中,
MyBatis将缓存和对缓存相关的操作封装成了Cache接口中。
SqlSession、Executor、Cache之间的关系如下列类图所示:



如上述的类图所示,Executor接口的实现类BaseExecutor中拥有一个Cache接口的实现类PerpetualCache,
则对于BaseExecutor对象而言,它将使用PerpetualCache对象维护缓存。

综上,SqlSession对象、Executor对象、Cache对象之间的关系如下图所示:

PerpetualCache实现原理其实很简单,其内部就是通过一个简单的HashMap<k,v>
来实现的,没有其他的任何限制。如下是PerpetualCache的实现代码:
[java]  view plain  copy
  1. package org.apache.ibatis.cache.impl;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5. import java.util.concurrent.locks.ReadWriteLock;  
  6. import java.util.concurrent.locks.ReentrantReadWriteLock;  
  7.   
  8. import org.apache.ibatis.cache.Cache;  
  9. import org.apache.ibatis.cache.CacheException;  
  10.   
  11. public class PerpetualCache implements Cache {  
  12.   
  13.   private String id;  
  14.   
  15.   <strong>private Map<Object, Object> cache = new HashMap<Object, Object>();</strong>  
  16.   
  17.   private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();  
  18.   
  19.   public PerpetualCache(String id) {  
  20.     this.id = id;  
  21.   }  
  22.   
  23.   public String getId() {  
  24.     return id;  
  25.   }  
  26.   
  27.   public int getSize() {  
  28.     return cache.size();  
  29.   }  
  30.   
  31.   public void putObject(Object key, Object value) {  
  32.     cache.put(key, value);  
  33.   }  
  34.   
  35.   public Object getObject(Object key) {  
  36.     return cache.get(key);  
  37.   }  
  38.   
  39.   public Object removeObject(Object key) {  
  40.     return cache.remove(key);  
  41.   }  
  42.   
  43.   public void clear() {  
  44.     cache.clear();  
  45.   }  
  46.   
  47.   public ReadWriteLock getReadWriteLock() {  
  48.     return readWriteLock;  
  49.   }  
  50.   
  51.   public boolean equals(Object o) {  
  52.     if (getId() == ) throw new CacheException("Cache instances require an ID.");  
  53.     if (this == o) return true;  
  54.     if (!(o instanceof Cache)) return false;  
  55.   
  56.     Cache otherCache = (Cache) o;  
  57.     return getId().equals(otherCache.getId());  
  58.   }  
  59.   
  60.   public int hashCode() {  
  61.     if (getId() == ) throw new CacheException("Cache instances require an ID.");  
  62.     return getId().hashCode();  
  63.   }  
  64.   
  65. }  
3>.一级缓存的生命周期有多长?
a.MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象,
   Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
b.如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;
c.如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用;
d.SqlSession中执行了任何一个update操作(update()、delete()、insert()),都会清空PerpetualCache对象的数据,但是该对象可以继续使用;

4>. SqlSession 一级缓存的工作流程:

1.对于某个查询,根据statementId,params,rowBounds来构建一个key值,根据这个key值去缓存Cache中取出对应的key值存储的缓存结果;
2. 判断从Cache中根据特定的key值取的数据数据是否为空,即是否命中;
3. 如果命中,则直接将缓存结果返回;
4. 如果没命中:
        4.1  去数据库中查询数据,得到查询结果;
        4.2  将key和查询到的结果分别作为key,value对存储到Cache中;
        4.3. 将查询结果返回;
5. 结束。

5>.Cache中Map的key值:CacheKey

我们知道,Cache最核心的实现其实就是一个Map,将本次查询使用的特征值作为key,将查询结果作为value存储到Map中。

现在最核心的问题出现了:怎样来确定一次查询的特征值?
换句话说就是:怎样判断某两次查询是完全相同的查询?
也可以这样说:如何确定Cache中的key值?

MyBatis认为,对于两次查询,如果以下条件都完全一样,那么就认为它们是完全相同的两次查询:
1. 传入的statementId
   传入的statementId,对于MyBatis而言,你要使用它,必须需要一个statementId,它代表着你将执行什么样的Sql;
2. 查询时要求的结果集中的结果范围(结果的范围通过rowBounds.offset和rowBounds.limit表示);
3. 这次查询所产生的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql())
4. 传递给java.sql.Statement要设置的参数值
综上所述,CacheKey由以下条件决定:statementId  + rowBounds  + 传递给JDBC的SQL  + 传递给JDBC的参数值

原文: http://www.xuebuyuan.com/2231229.html

2.二级缓存

1>.MyBatis的缓存机制整体设计以及二级缓存的工作模式
MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。

如上图所示,当开一个会话时,一个 SqlSession 对象会使用一个 Executor 对象来完成会话操作, 
MyBatis 的二级缓存机制的关键就是对这个 Executor 对象做文章。如果用户配置了" cacheEnabled=true ",
那么 MyBatis 在为 SqlSession 对象创建 Executor 对象时,会对 Executor 对象加上一个装饰者: CachingExecutor ,
这时 SqlSession 使用 CachingExecutor 对象来完成操作请求。
CachingExecutor 对于查询请求,会先判断该查询请求在 Application 级别的二级缓存中是否有缓存结果,
如果有查询结果,则直接返回缓存结果;
如果缓存中没有,再交给真正的 Executor 对象来完成查询操作,
之后 CachingExecutor 会将真正 Executor 返回的查询结果放置到缓存中,然后再返回给用户。 


CachingExecutor是Executor的装饰者,以增强Executor的功能,使其具有缓存查询的功能,这里用到了设计模式中的 装饰者模式 。

 MyBatis二级缓存的划分
 MyBatis并不是简单地对整个Application就只有一个Cache缓存对象,
 它将缓存划分的更细,即是Mapper级别的,即每一个Mapper都可以拥有一个Cache对象,具体如下: 
a.为每一个Mapper分配一个Cache缓存对象(使用<cache>节点配置);
b.多个Mapper共用一个Cache缓存对象(使用<cache-ref>节点配置); 

使用二级缓存,必须要具备的条件
 MyBatis对二级缓存的支持粒度很细,它会指定某一条查询语句是否使用二级缓存。

虽然在Mapper中配置了<cache>,并且为此Mapper分配了Cache对象,
这并不表示我们使用Mapper中定义的查询语句查到的结果都会放置到Cache对象之中,
我们必须指定Mapper中的某条选择语句是否支持缓存,即在<select>节点中配置useCache="true" , 

Mapper才会对此Select的查询支持缓存特性,

<cache 
eviction="FIFO"  <!--回收策略为先进先出-->
flushInterval="60000" <!--自动刷新时间60s-->
size="512" <!--最多缓存512个引用对象-->
readOnly="true"/> <!--只读-->

二级缓存作用域为 Mapper(Namespace);(整个项目期间application)

configuration.MappedStatement.Cache;项目启动时会初始化;

Mybatis框架在初始化阶段会对XML配置文件进行读取,将其中的sql语句节点对象化为一个个MappedStatement对象,

即一个<select />、<update />或者<insert />标签;


总之,要想使某条Select查询支持二级缓存,你需要保证: 
1.MyBatis支持二级缓存的总开关:全局配置变量参数cacheEnabled=true
2.该select语句所在的Mapper,配置了<cache> 或<cached-ref>节点,并且有效
3.该select语句的参数useCache=true 

一级缓存和二级缓存的使用顺序 :
二级缓存———> 一级缓存——> 数据库 

 二级缓存实现的选择
 MyBatis对二级缓存的设计非常灵活,它自己内部实现了一系列的Cache缓存实现类,并提供了各种缓存刷新策略如LRU,FIFO等等;
 另外,MyBatis还允许用户自定义Cache接口实现,用户是需要实现org.apache.ibatis.cache.Cache接口,
 然后将Cache实现类配置在<cache type="">节点的type属性上即可;
 除此之外,MyBatis还支持跟第三方内存缓存库如Memecached的集成,总之,使用MyBatis的二级缓存有三个选择:
1.MyBatis自身提供的缓存实现;
2.用户自定义的Cache接口实现;
3.跟第三方内存缓存库的集成;

MyBatis自身提供的二级缓存的实现
MyBatis自身提供了丰富的,并且功能强大的二级缓存的实现,它拥有一系列的Cache接口装饰者,可以满足各种对缓存操作和更新的策略。
MyBatis定义了大量的Cache的装饰器来增强Cache缓存的功能,如下类图所示。 
对于每个Cache而言,都有一个容量限制,MyBatis各供了各种策略来对Cache缓存的容量进行控制,以及对Cache中的数据进行刷新和置换。 
MyBatis主要提供了以下几个刷新和置换策略: 
LRU:(Least Recently Used),最近最少使用算法,即如果缓存中容量已经满了,会将缓存中最近做少被使用的缓存记录清除掉,然后添加新的记录; 
FIFO:(First in first out),先进先出算法,如果缓存中的容量已经满了,那么会将最先进入缓存中的数据清除掉; 
Scheduled:指定时间间隔清空算法,该算法会以指定的某一个时间间隔将Cache缓存中的数据清空;



三、Cache使用时的注意事项/避免使用二级缓存

注意事项

1. 只能在【只有单表操作】的表上使用缓存
不只是要保证这个表在整个系统中只有单表操作,而且和该表有关的全部操作必须全部在一个namespace下。
2. 在可以保证查询远远大于insert,update,delete操作的情况下使用缓存
这一点不需要多说,所有人都应该清楚。记住,这一点需要保证在1的前提下才可以!

避免使用二级缓存
可能会有很多人不理解这里,二级缓存带来的好处远远比不上他所隐藏的危害。
1.缓存是以namespace为单位的,不同namespace下的操作互不影响。
2.insert,update,delete操作会清空所在namespace下的全部缓存。
3.通常使用MyBatis Generator生成的代码中,都是各个表独立的,每个表都有自己的namespace。

针对一个表的某些操作不在它独立的namespace下进行。
例如在UserMapper.xml中有大多数针对user表的操作。但是在一个XXXMapper.xml中,还有针对user单表的操作.
这会导致user在两个命名空间下的数据不一致。如果在UserMapper.xml中做了刷新缓存的操作,
在XXXMapper.xml中缓存仍然有效,如果有针对user的单表查询,使用缓存的结果可能会不正确。

更危险的情况是在XXXMapper.xml做了insert,update,delete操作时,会导致UserMapper.xml中的各种操作充满未知和风险。

有关这样单表的操作可能不常见。但是你也许想到了一种常见的情况。

多表操作一定不能使用缓存
首先不管多表操作写到那个namespace下,都会存在某个表不在这个namespace下的情况。

例如两个表:role和user_role,如果我想查询出某个用户的全部角色role,就一定会涉及到多表的操作。
<select id="selectUserRoles" resultType="UserRoleVO">
    select * from user_role a,role b where a.roleid = b.roleid and a.userid = #{userid}
</select>
像上面这个查询,你会写到那个xml中呢??
不管是写到RoleMapper.xml还是UserRoleMapper.xml,或者是一个独立的XxxMapper.xml中。如果使用了二级缓存,都会导致上面这个查询结果可能不正确。
如果你正好修改了这个用户的角色,上面这个查询使用缓存的时候结果就是错的。

最后还是建议,放弃二级缓存,在业务层使用可控制的缓存代替更好。

参考:
http://www.th7.cn/Program/java/201411/321081.shtml

http://blog.youkuaiyun.com/isea533/article/details/44566257


部分源码:
Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = ssf.openSession();
session.selectOne("selectUser", "3");
******************************************************************
1.SqlSessionFactoryBuilder类 build()
-----------------------------------------------------------
public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
}

2.DefaultSqlSessionFactory类 openSession()
-----------------------------------------------------------
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
    Transaction tx = null;
    try {
      final Environment environment = configuration.getEnvironment();
      final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
      tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
       final Executor executor = configuration.newExecutor(tx, execType, autoCommit);
      return new DefaultSqlSession(configuration, executor);

    } catch (Exception e) {
      closeTransaction(tx); // may have fetched a connection so lets call close()
      throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

3.Configuration类 newExecutor()
-----------------------------------------------------------
public Executor newExecutor(Transaction transaction, ExecutorType executorType, boolean autoCommit) {
    executorType = executorType == null ? defaultExecutorType : executorType;
    executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
    Executor executor;
    if (ExecutorType.BATCH == executorType) {
      executor = new BatchExecutor(this, transaction);
    } else if (ExecutorType.REUSE == executorType) {
      executor = new ReuseExecutor(this, transaction);
    } else {
       executor = new SimpleExecutor(this, transaction);
    }
     if (cacheEnabled) {//装饰模式
      executor = new CachingExecutor(executor, autoCommit);
    }

    executor = (Executor) interceptorChain.pluginAll(executor);
    return executor;
  }

4.SimpleExecutor类 extends BaseExecutor
-----------------------------------------------------------
BaseExecutor类
protected PerpetualCache localCache;
PerpetualCache类
private Map<Object, Object> cache = new HashMap<Object, Object>();

BaseExecutor类    query()方法
list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;//先从一级缓存中查
if (list != null) {
    handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
} else {
    list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);//一级缓存中没有命中,从db查
}

5.CachingExecutor类 query()方法
-----------------------------------------------------------
 private Executor delegate;//装饰者模式,默认BaseExecutor.query()

cache.getReadWriteLock().readLock().lock();//加锁
try {
    List<E> cachedList = (List<E>) cache.getObject(key);//先从二级缓存中查
    if (cachedList != null) return cachedList;
  } finally {
    cache.getReadWriteLock().readLock().unlock();//去锁
  }
//二级缓存中没有命中,从delegate中查(默认BaseExecutor.query() 从一级缓存中查,一级缓存中没有就从db中查)
List<E> list = delegate.<E> query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);

******************************************************************


来源:https://blog.youkuaiyun.com/u010558660/article/details/51801099

Node-Red系列教程——NodeRed通过OPC UA读取数据并写入mysql NodeRed通opcua读取西门子数据并存入mysql 阅读详情

相关推荐

ad新版本学习笔记(基本包含一套流程)Altium Designer(ad20/ad21/ad22/ad23)

ad20-ad23学习笔记,逐渐补全

安和的博客 4万+

MyBatis的配置和使用原理

MyBatis的配置和使用原理 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库 中的记录。 MyBatis让程序将主要精力放在sql上,通过MyBatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql

BabyPower66的博客 637

Coze智能体网页集成实战:从零搭建免登录AI助手

本文详细介绍了如何利用Coze Chat SDK从零开始为网站集成免登录AI助手。通过获取访问令牌和智能体ID,仅需几行JavaScript代码即可将功能完整的对话窗口嵌入网页,实现开箱即用的智能交互。文章重点讲解了核心部署步骤、会话隔离方案以及UI深度定制方法,帮助开发者快速打造贴合品牌、提升用户体验的网页AI助手。

gold8的专栏 560

mybatis一级缓存、二级缓存的意义是什么?

一看到这个问题的时候,我就热泪盈眶,因为在我第一次和第二次参加面试的时候,这个问题都有被问到,而且还都没答对,因为当时只是会SSM框架的简单实用,增删改查啥的一点问题没有,一级缓存,二级缓存?当时真的很懵逼,这次,我就把它分享出来,希望大家不要遇到和我一样的窘境。 1、一级缓存:指的是mybatis中sqlSession对象的缓存,当我们执行查询以后,查询的结果会同时存入sqlSession中,再次查询的时候,先去sqlSession中查询,有的话直接拿出,当sqlSession消失时,mybatis的一

分享Java技术知识,共同成长进步! 2095

保姆级教程:RK3588部署yolo目标检测模型

RK3588部署yolo目标检测模型非常详细的保姆级教程

ling913的专栏 5488

PLC控制气缸与电磁阀:从原理到实战编程详解

在工业自动化领域,很多工程师都能编写PLC程序控制电机启停,但当涉及到气缸和电磁阀的精确控制时,却常常遇到动作不协调、响应延迟甚至设备损坏的问题。这背后的关键不在于PLC编程本身,而在于对气动元件特性和控制逻辑的深入理解。 本文将从实际工程问题出发,深入解析气缸与电磁阀的工作原理、PLC控制逻辑设计、常见故障排查方法,并通过完整的梯形图实例,帮助读者掌握气动系统自动化编程的核心要点。无论你是刚接触PLC的初学者,还是希望提升气动控制技能的工程师,都能从中获得实用的技术指导。 1. 气缸与电磁阀在自动化控制中

weixin_42522374的博客 341

Mybatis缓存详解

缓存的重要性是不言而喻的。 使用缓存, 我们可以避免频繁的与数据库进行交互, 尤其是在查询越多、缓存命中率越高的情况下, 使用缓存对性能的提高更明显。 mybatis 也提供了对缓存的支持, 分为一级缓存和二级缓存。 但是在默认的情况下, 只开启一级缓存(一级缓存是对同一个 SqlSession 而言的)。 1 一级缓存 同一个 SqlSession 对象, 在参数和 SQL 完全一样的情况先, 只执行一次 SQL 语句(如果缓存没有过期) 也就是只有在参数和 SQL 完全一样的情况下, 才会有这种情况.

weixin_42943586的博客 292

Python爬虫实战:利用Playwright+Asyncio高效获取淘宝商品价格变化曲线

本文将详细介绍如何使用Python最新技术栈(Playwright+Asyncio)构建一个高效的淘宝商品价格监控爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、数据存储与分析,最终实现价格变化曲线的可视化展示。文章包含完整的代码实现和详细的技术解析,适合中高级Python开发者学习参考。关键词:Python爬虫、Playwright、Asyncio、淘宝价格监控、数据可视化支持多浏览器(Chromium, Firefox, WebKit)更快的执行速度更丰富的API。

2201_76125261的博客 245

MyBatis缓存技术(一级缓存、二级缓存)

1、MyBatis的缓存分类 一级缓存 一级缓存的作用域是一个SqlSession。MyBatis默认开启一级缓存。在同一个SqlSession中,执行相同的查询SQL,第一次会查询数据库,并写到缓存中;第二次直接从缓存中读取。当执行SQL时,两次查询中间发生了增、删、改的操作,则SqlSession的缓存会被清空。 二级缓存 二级缓存的作用域是一个namesp下的mapper映射文件内容

分享日常工作技术 1020

手把手教你学Simulink——基础电机控制场景实例:基于Simulink的永磁同步发电机温度场耦合仿真

摘要:本文详细介绍了基于Simulink的永磁同步发电机(PMSG)电-热耦合仿真方法。通过Simscape Electrical搭建含热端口的PMSG模型,结合集总参数热网络(LPTN)实现损耗计算与温度反馈,分析了过载工况下温升对电阻和永磁体性能的影响。仿真结果表明:150%过载20秒会导致绕组温升132°C,电阻增加42%,磁链衰减10.5%。文章还提供了自然冷却与强迫风冷的对比数据,并建议通过多物理场耦合仿真预防实机过热问题。该方法可有效支撑高功率密度电机热设计,避免永磁体退磁风险。

MHD0815的博客 252

OKX 欧易 交易机器人开发基础

接口文档: https://www.okx.com/docs-v5/zh/#overview REST API 常用请求 查看账户余额 结果数据格式: 获取限价 结果格式: 获取指数行情 数据结构: 下单 结果数据: 获取未成交订单列表 返回结果: 撤单 结果结构:

Willin Wang 的全栈升级指南 2万+

MYBATIS缓存

MYBATIS的第一缓存是SQLSession 并且这种缓存是即使在仅仅只有一个框架的情况下都是存在的, 因为第一缓存是默认开启的(default), 因为第一缓存级别使用的是SqlSession, 所以在调用同一个SqlSession, 并且在这同一个SqlSession当中多次查询同一个数据, 那么仅仅只会执行一次相应的SQL语句, 之后会直接从SQL缓存当中进行获取以我的测试类为例@Test结果如图所示, 跟我们预想的一样, 在第一级别的缓存下, 仅仅调用了一次相应的查询语句。

2303_79546217的博客 1434

STM32 stack_size和heap_size大小设置的意义

在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。 1、若工程中使用的局部变量较多,定义的数据长度较大时,若不调整栈的空间大小,则会导致程序出现栈溢出,程序运行结果与预期的不符或程序跑飞。这时我们就需要手动的调整栈的大小。 2、当工程中使用了malloc动态分配内存空间时,这时分配.......

zxm8513优快云博客 3万+

MyBatis——MyBatis的缓存

MyBatis的缓存

wan的博客 2389

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【MyBatis】| MyBatis的缓存

【MyBatis】| MyBatis的缓存

m0_61933976的博客 5045

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【MyBatis】MyBatis的缓存

因此这些对象不能被修改。查询的数据会被缓存,下次查询相同的数据,就 会从缓存中直接获取,不会从数据库重新访问。先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。查询的结果会被 缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取。两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效。查询的数据所转换的实体类类型必须实现序列化的接口。最近最少使用的:移除最长时间不被使用的对象。不同的SqlSession对应不同的一级缓存。关闭之后,一级缓存中的数据会写入二级缓存。

Javascript_tsj的博客 1455

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【mybatis】缓存

比如要对数据库进行查询:select * from A因为真正执行的是sqlsession,用sqlsession对他进行查询,查询到的数据会缓存到local catch本地缓存中,下一次再查询,就不用查询数据库了,直接从本地缓存中拿取。$1. 首次进行:@Test@Test结果:执行两次查询,但是sql语句只执行一次。为什么?因为第二次查询从本地缓存查数据。@Test注!!值是true, 表明指向的是同一个地址空间,指向的是同一个对象。

m0_75163045的博客 1972

Mybatis——MyBatis 缓存

MyBatis缓存

秋玄的博客 1663

Mybatis之缓存

一、MyBatis的一级缓存二、MyBatis的二级缓存三、二级缓存的相关配置四、MyBatis缓存查询的顺序五、整合第三方缓存EHCache1、添加依赖2、各个jar包的功能3、创建EHCache的配置文件ehcache.xml4、设置二级缓存的类型5、加入logback日志6、EHCache配置文件说明以上就是Mybatis之缓存的相关知识点,希望对你有所帮助。积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!

哥的时代,为你保驾护航 2030

MyBatis 的缓存机制

MyBatis 缓存包括:一级缓存:将查询到的数据存储到 SqlSession 中二级缓存:将查询到的数据存储到 SqlSessionFactory 中或者是集成其它第三方的缓存:比如 EhCache(Java语言开发的),Memcache(C语言开发的)等。注意:缓存只针对于 DQL(查询)语句,也就是说缓存机制只对应 Select 语句。一级缓存默认是开启的一级缓存失效情况包括两种:第一种:第一次查询和第二次查询之间,手动清空了一级缓存。

weixin_61635597的博客 2031

MyBatis之缓存

在当今的 Web 应用程序中,性能是至关重要的。缓存是提高应用程序性能的一种常用技术,它可以减少数据库查询的次数,从而提高应用程序的响应时间。MyBatis 是一个流行的 Java ORM(对象关系映射)框架,它提供了强大的缓存功能,可以帮助开发者提高应用程序的性能。在本博客中,我们将介绍 MyBatis 缓存的基本概念和工作原理,以及如何在 MyBatis 中配置和使用缓存。我们还将介绍一些常见的缓存策略和缓存过期机制,以帮助开发者更好地管理缓存。

liubopro666的博客 2308

MyBatis的缓存

为什么使用缓存?首次访问时,查询数据库,并将数据存储到内存中;再次访问时直接访问缓存,减少IO、硬盘读写次数、提高效率Mybatis中的一级缓存和二级缓存?一级缓存:它指的是mybatis中的SqlSession对象的缓存。当我们执行完查询之后,查询的结果会同时存在在SqlSession为我们提供的一块区域中。当我们再次查询同样的数据,mybatis会先去SqlSession中查询是否有,有的话直接拿出来使用。当SqlSession对象消失时,Mybatis的一级缓存也就消失了。

qq_63242968的博客 1251
上一篇: Java:代码验证 StringBuffer 线程安全,StringBuilder 非线程安全
下一篇: chrome开发者工具功能拾遗:Sources面板篇
ole_triangle_java
博客等级 码龄10年 82粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值