二级缓存

MyBatis 之旅

断了今生、忘了曾经 提交于 2019-12-01 12:47:32
什么是MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 总结:持久层框架,SQL定制,省去JDBC操作,JavaBean与数据库记录的对应转换; Batis,估计是作者的一只宠物鸟; 关于Mapper.xml 文件的位置 1、放在 java 目录下:站在开发角度,方便查找文件,便于开发(我比较喜欢); 2、放在resources 目录下:站在软件工程角度,xml确实是资源文件; 修改配置属性 mybatis: mapper-locations: classpath:com/example/mybatis/dev/dao/mapper/*Mapper.xml type-aliases-package: com.example.mybatis.dev.model 修改pom.xml文件 <build> <resources> <!-- mapper.xml文件在java目录下 --> <resource> <directory>src/main/java<

Ehcache学习笔记——初识Ehcache

江枫思渺然 提交于 2019-12-01 12:26:57
1. Ehcache 的主要特性和集群方案 EHCache EHCache 是一个纯 java 的在进程中的缓存,是 Hibernate 中默认的 CacheProvider,最小的依赖性, 全面的文档和测试,最新版本为 2.0.1。 缓存应用在多个领域并发挥作用,ehcache 可应用于数据库访问缓存,安全认证缓存,web 缓存,soap 和 RESTFul 服务缓存,应用程序持久对象缓存以及分布式缓存。 (1)EhCache 的主要特性有: a) 快速; b) 简单; c)多种缓存策略; d)缓存数据有两级:内存和磁盘,因此无需担心容量问题; e)缓存数据会在虚拟机重启的过程中写入磁盘; f)可以通过 RMI、可插入 API 等方式进行分布式缓存; g) 具有缓存和缓存管理器的侦听接口; h) 支持多缓存管理器实例,以及一个实例的多个缓存区域; i) 提供 Hibernate 的缓存实现; (2)EhCache 从 1.7 版本后,支持五种集群方案,分别是: a) Terracotta b)RMI c)JMS d)JGroups e)EhCache Server 2. Ehcache 的层次模型 Ehcache 的类层次模型主要为三层,最上层的是 CacheManager ,他是操作 Ehcache 的入 口。我们可以通过 CacheManager.getInstance(

Hibernate缓存与集合性能分析

情到浓时终转凉″ 提交于 2019-12-01 12:26:45
Hibernate作为一个应用级的数据访问层封装,只能在其作用范围内保持cache中数据的有效性,如果系统与第三方系统共享数据库的情况下,Hibernate的Cache机制可能失效。 Hibernate在本地JVM中维护了一个缓存池,并将从数据库获得的数据保存到池中以供下次重用。 外部系统的定义,并非限于本系统之外的第三方系统,即使在本系统中,如果出现了绕过Hibernate数据存储机制的其他数据存取手段,那么Cache的有效性也必须细加考量。 1. Cache分类 Hibernate中的Cache大致分为两层: (1) Session级别缓存:在Session实现,属于事务级数据缓冲;一旦事务结束,这个Cache也就失效。此层为内置实现,无需进行干涉。 (2) 二级缓存:Hibernate中对其实力范围内的数据进行缓存的管理容器。 2. 缓存映射 配置缓存映射时通过设置类或集合映射的<cache>元素来设定的。如: < cache usage ="transactional | read-write | nonstrict-read-write | read-only" region ="RegionName" include ="all | non-lazy" /> usage:必须。说明了缓存的策略;、 ----read-only:如果只需要读取一个持久化类的实例,而无需修改

浅析Hibernate 3二级缓存基础

拜拜、爱过 提交于 2019-12-01 12:26:25
这里介绍Hibernate 3二级缓存和session级别的缓存一样都只对实体对象做缓存,不对属性级别的查询做缓存;二级缓存的生命周期和sessionFactory的生命周期是一样的,sessionFactory可以管理二级缓存等。 AD: 在向大家详细介绍Hibernate 3之前,首先让大家了解下Hibernate 3二级缓存,以后全面介绍Hibernate 3。 1.Hibernate 3二级缓存和session级别的缓存一样都只对实体对象做缓存,不对属性级别的查询做缓存;二级缓存的生命周期和sessionFactory的生命周期是一样的,sessionFactory可以管理二级缓存; 2.sessionFactory级别的缓存,需要手动配置;所有的session可以共享sessionFactory 级别的缓存;(一般把一些不经常变化的实体对象放到sessionFactory级别的缓存中,适合放不经常变化的实体对象。) 3.Hiberante 3二级缓存的配置和使用方法如下: 必须把ehcache.jar包导入,然后到Hibernate3.2的etc文件下把ehcache.xml复制到工程src目录下(ehcache.xml里边的参数里边有详细英文说明); 说明:ehcache.jar是第三方法的缓存产品,hiberante只是把它做了集成

mybatis一级缓存和二级缓存(一)

柔情痞子 提交于 2019-12-01 09:54:15
一级缓存: 就是Session级别的缓存。一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中。 如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据。 它是内置的事务范围的缓存,不能被卸载。 二级缓存: 就是SessionFactory级别的缓存。顾名思义,就是查询的时候会把查询结果缓存到二级缓存中。 如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库。 这是可选的插件式的缓存,在默认情况下,SessionFactory不会启用这个插件。 可以在每个类或每个集合的粒度上配置。缓存适配器用于把具体的缓存实现与Hibernate集成。 严格意义上说, SessionFactory缓存分为两类:内置缓存和外置缓存。我们通常意义上说的二级缓存是指外置缓存。 内置缓存与session级别缓存实现方式相似。前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据 SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句。 映射元数据是映射文件中数据的拷贝;

mybatis一级缓存和二级缓存(二)

旧城冷巷雨未停 提交于 2019-12-01 09:54:12
注意事项与示例配置 一级缓存   Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。               为什么要使用一级缓存,不用多说也知道个大概。但是还有几个问题我们要注意一下。    1、一级缓存的生命周期有多长?    a、MyBatis在开启一个数据库会话时,会 创建一个新的 SqlSession 对象, SqlSession 对象中会有一个新的 Executor 对象。 Executor 对象中持有一个新的 PerpetualCache 对象;当会话结束时, SqlSession 对象及其内部的 Executor 对象还有 PerpetualCache 对象也一并释放掉。   b、如果 SqlSession 调用了 close() 方法,会释放掉一级缓存 PerpetualCache 对象,一级缓存将不可用。   c、如果 SqlSession 调用了

mybatis一级缓存和二级缓存(三)

我的未来我决定 提交于 2019-12-01 09:54:01
缓存详细介绍,结果集展示 https://blog.csdn.net/u013036274/article/details/55815104 配置信息 http://www.pianshen.com/article/16399265/ **** *** *****详细介绍********** *** https://my.oschina.net/zjllovecode/blog/1817577?from=timeline&isappinstalled=0 一级缓存基于sqlSession默认开启,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据。 不同的SqlSession之间的缓存数据区域是互相不影响的。 一级缓存的作用域是SqlSession范围的,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存), 第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。 需要注意的是,如果SqlSession执行了DML操作(增删改),并且提交到数据库,MyBatis则会 清空SqlSession中的一级缓存 ,这样做的目的是为了保证缓存中存储的是 最新的信息,避免出现脏读现象。 当一个SqlSession结束后该SqlSession中的一级缓存也就不存在了。

MyBatis缓存

余生长醉 提交于 2019-12-01 09:53:11
一. 什么是查询缓存 Mybatis 的一级缓存 是指 SqlSession 。一级缓存的作用域是一个SqlSession 。 Mybatis 默认开启一级缓存 。 在同一个SqlSession 中,执行相同的查询SQL ,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL 时两次查询中间发生了增删改操作,则SqlSession 的缓存清空。 Mybatis 的二级缓存 是指 mapper 映射文件 。二级缓存的作用域是同一个namespace 下的mapper 映射文件内容,多个SqlSession 共享。 Mybatis 需要手动设置启动二级缓存 。 在同一个namespace 下的mapper 文件中,执行相同的查询SQL ,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL 时两次查询中间发生了增删改操作,则二级缓存清空。 二.一级缓存 一级缓存 MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key被缓存(跟mysql缓存一样,修改任何参数的值都会导致缓存失效) 1)单独使用MyBatis而不继承Spring,使用原生的MyBatis的SqlSessionFactory来构造sqlSession查询,是可以使用以及缓存的,示例代码如下 public class Test {

延迟加载和缓存

半腔热情 提交于 2019-12-01 09:46:42
一、延迟加载   1、 直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。   2、 侵入式延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情属性时,就会马上执行关联对象的 select查询。     侵入式延迟的配置:       (1)配置mybatis-config.xml文件         在mybatis-config.xml文件中插入setting节点,并设置name属性和value属性值,配置lazyLoadingEnabled                (2)小配置文件中select语句必须为两条                (3)Test测试类                (4)执行结果如下(当不掉用对象中的字段或属性时只执行一条SQL)                  当调用其属性时执行的结果如下              3、 深度延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的 select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。     深度延迟的配置:       (1)配置mybatis-config.xml文件,在mybatis-config

Mybatis----Mybatis使用

China☆狼群 提交于 2019-12-01 09:06:32
对映射文件(mapper.xml说明) <mapper namespace="com.zy.Dao.UserDao"> //namespace:命名空间 <select id="selectById" resultType="User" parameterType="int"> //id:表示映射文件的sql,将sql语句封装到mappedStatement对象中,所以又叫statement的id,parmeterType(可以不指定):输入类型的参数,如果指定类型是简单类型(int,String等),参数名可以任意 SELECT * FROM t_user WHERE id = #{id} ; </select> </mapper> MyBatis 使用 增删改查 增 <insert id="insert"> INSERT INTO tb_user ( id, username, password, phone, email, created, updated ) VALUES ( #{id}, #{username}, #{password}, #{phone}, #{email}, #{created}, #{update} ) </insert>    mysql自增主键:返回主键(主键被设置到了传入参数的user上) <insert id="insetone">