MyBatis中关于session以及cache的管理

Mybatis中缓存分为一级缓存与二级缓存:

一级缓存指的只是缓存级别的一个命名,主要就是每个sqlsession里都有一个HashMap来存储数据,当然不同对象每个缓存区域也不一样,所以一级缓存是不相互影响的。

二级缓存是mapper级别的的,也就是每个sqlsession都可以访问同一个mapper,这里不是说二级缓存只有一个,也是每个mapper中有一个,就比如UserMapper,TestMapper,当然前提是这两个mapper的namespace是不样的(一般每个mapper都是不一样的),因为真正区别二级缓存的是namespace,也就是每个namespace对应一个独一无二的二级缓存,这里二级缓存的存储也就是HashMap。

MyBatis缓存机制:

首先一级缓存默认是开启的,一级缓存是sqllsession级别的缓存,sqlsession对象中有一个数据结构HashMap用于存储缓存数据, 不同的sqlsession之间的一级缓存不相互影响的。

二级缓存也是默认开启的,对于每个sqlsession如果查询的是同一个mapper(namespace)都可以从同一个二级缓存中读取。

mybatis缓存特性
当用户进行查询的时候,mybatis提供缓存机制可以将数据存储下来,一遍之后在次查询的时候可以直接从缓存中读取,而不用再次查询数据库,mybatis存储方式HashMap,一级缓存对应的是mapper中的sql的id为key来存储缓存数据,首先当发起请求查询数据库的时候会先产看二级缓存是否开启,如果开启会从二级缓存中查看,如果没有开启会先从mybatis一级中的缓存(HashMap)中去查询,如果不存在那么将会执行sql语句,再将数据存入缓存。当执行更新,删除,插入的时候缓存中的数据将会被清空,清空的目的也就是为了避免从缓存中的读取脏数据,也就是保证缓存中的数据都是最新的数据。

mybatis自身缓存的弊
由于mybatis不是一个专门做缓存处理,现在有一个十分明显的弊端就是,一般我们的网页就是分布式的发布,也就是最少使用两个服务器,如果使用两个服务器mybatis的缓存技术就无法在两个服务器通用就是,也就是两个服务器无法达到数据通用,比如我在一个服务器存储了我的信息,但是我转跳到另一个服务器那使用mybatis数据就是需要从新加载,这里就是一个非常大的问题。还有就是mybatis无法实现细粒度的缓存管理,当你查询大量数据的时候而且将数据存储到mybatis二级缓存中的时候,但是一旦队一个数据操作增加,删除,修改,这里二级缓存就全部清空,而mybatis无法实现对这里单个信息的修改,这里可以使用三级缓存,三级缓存需要自己实现。

mybatis与缓存框架整合
缓存框架这里使用ehcache作为例子,ehcache就是一个分布式框架。

mapper文件配置

<!-- 开启本mapper(namespace)的二级缓存
              type:指定cache接口的实现类型,mybatis默认的是PerpetualCache
              如果要和ehcache整合只需要配置type为ehacache的实现类即可
              -->
          <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

这里只需要配置cache的type就可以,这样就可以将缓存数据交给ehcache管理。

ehcache配置文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
  updateCheck="false">
    <!--diskStore:缓存数据持久化的目录 地址  -->
    <diskStore path="c:\temp\lhd"/>
    <defaultCache
        maxElementsInMemory="1000"
        maxElementsOnDisk="10000000"
        eternal="false"
        overflowToDisk="false"
        diskPersistent="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache>

原文链接:https://blog.csdn.net/yiyongjiajun521/article/details/81866937

原文地址:https://www.cnblogs.com/yrjns/p/12056992.html

时间: 2024-08-10 20:17:49

MyBatis中关于session以及cache的管理的相关文章

web 项目中 SQLAlchemy session 的生命周期管理

假设已有一个 Session 工厂类: Session = sessionmaker(bind=some_engine) 那么 session 实例的生命周期可以为: 最短模式 -- 每次请求新建一个 session,用完就 close @contextmanager def get_session_scope(): try: s = Session() yield s s.commit() except: s.rollback() finally: s.close() 这种模式不适合 web

Mybatis中的缓存管理

目录 Mybatis中的缓存管理 查询缓存工作原理: 配置缓存: 默认配置: 使用二级缓存: 刷新缓存过程: 配置EHcache 产生脏数据 使用原则: Mybatis中的缓存管理 查询缓存工作原理: 查询语句?<--->?缓存?<---->?DB 缓存内容: Mybatis中存放的是查询的内容: 缓存对比: 类别 作用范围 生命周期 一级缓存 namespace 和sqlsession的生存周期相同 二级缓存 namespace 和整个应用的生命周期相同 一级缓存:默认是开启的,

关于缓存中Cookie,Session,Cache的使用

文章来源:http://canann.iteye.com/blog/1941173 以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application. 其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息. Session则保存对话信息.Application则是保存在整个应用程序范围内的信息,相当于全局变量. Session Session用来保存每一个用户的专有信息 Session的生存期是用户持续请求时间加上一段时间(一般是20分

How Tomcat works — 八、tomcat中的session管理

在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的. 目录 概述 session的作用 session新建.查找和更新 session删除 总结 概述 在tomcatsession管理的类标准实现为StandardManager,主要作用为启动的是加载缓存的session,类关系如下: 在用户servlet中使用的session为StandardSessionFacade(也是

[转]tomcat中的session管理

转载地址:http://blog.csdn.net/iloveqing/article/details/1544958 当一个sesson开始时,Servlet容器会创建一个HttpSession对象,在某些情况下把这些Httpsession对象从内存中转移到文件 系统中或数据库中,需要访问的时候在把它们载入到内存中来.这样做的好处有两点:节约了内存的消耗,当web服务器产生故障时,还可以从文件系统或数据库 中恢复Session的数据.对于Session的管理,小猫提供了两个实现类:org.ap

使用ThreadLocal管理Mybatis中SqlSession对象

转自http://blog.csdn.net/qq_29227939/article/details/52029065 public class MybatisUtil { private static SqlSessionFactory factory; // 解决资源争抢问题. private static ThreadLocal<SqlSession> localSessions = new ThreadLocal<SqlSession>(); static { Reader

MyBatis之会话Session原理

MyBatis 之会话 Session 执行逻辑 1.SQL 会话工厂构建器类 SqlSessionFactoryBuilder 的 build 方法用于构建 SqlSessionFactory 类的实例: 2.SQL 会话工厂类的实例用于创建 Sql 会话 SqlSession 的实例: 3.SQL 会话 SqlSession 用于执行具体的 CURD 操作,其类似于 JDBC 中的连接类 Connection: 4.SQL 会话模板 SqlSessionTemplate 是 MyBatis

Mybatis中的resultType和resultMap

一.概述 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在. 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值. ①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给r

session和cache的区别

以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application. 其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息. Session则保存对话信息.Application则是保存在整个应用程序范围内的信息,相当于全局变量. 1.Session Session用来保存每一个用户的专有信息 Session的生存期是用户持续请求时间加上一段时间(一般是20分钟左右) Session信息是保存在Web服务器内存中的,保存数据量可大可小由于