hibernate学习笔记第七天:二级缓存和session管理
二级缓存配置
1.导入ehcache对应的三个jar包
ehcache/*.jar
2.配置hibernate使用二级缓存
2.1设置当前环境开始二级缓存的使用
<property name="cache.use_second_level_cache">true</property>
2.2设置使用的二级缓存种类
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
3.设置加入二级缓存的模型
方法一:
在hbm.xml文件中,设置类和关联关系对象是否使用二级缓存
<class name="cn.itcast.h3.query.hql.vo.TeacherModel" table="tbl_teacher">
***** <cache usage="read-write"/>
<id name="uuid" column="uuid">
<generator class="native" />
</id>
<property name="teacherName"/>
<property name="nick"/>
<set name="students">
***** <cache usage="read-write"/>
<key column="teacherUuid"/>
<one-to-many class="cn.itcast.h3.query.hql.vo.StudentModel"/>
</set>
</class>
方法二:
类级缓存的配置
<class-cache
usage="read-write"
class="cn.itcast.h3.query.hql.vo.TeacherModel"
/>
模型中的集合缓存的配置
<collection-cache
usage="read-write"
collection="cn.itcast.h3.query.hql.vo.TeacherModel.students"
/>
<class-cache
usage="read-write"
class="cn.itcast.h3.query.hql.vo.StudentModel"
/>
在进行集合缓存配置时,如果使用了某种集合,必须将该集合中的模型也配置到缓存中,
并且是类级缓存
4.二级缓存自身的配置
写在src目录下,ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="d:\cache-data"/>
<defaultCache
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="1200"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
5.自定义缓存级别设置
6.测试二级缓存的存在性
7.二级缓存中的数据格式
二级缓存中存储的是加载的数据的散装格式,散装数据
读取二级缓存时,每次创建一个全新的对象,并根据其中OID,查找到对应的属性数据,进行组装
8.验证SQL查询对缓存的影响
使用SQL查询的内容会加载到二级缓存中
使用SQL查询不读取二级缓存的数据,无论是否提供OID
9.添加的数据是不进入二级缓存的
10.删除的数据影响二级缓存中的对应数据
11.修改的数据影响二级缓存中的对应数据
关联集合数据二级缓存操作
1.关联集合数据也进入二级缓存
2.关联集合缓存里面存储的是每个对象的OID,而不是所有的数据,因此当类级缓存没有存储数据时
关联集合缓存中仅存OID,再次获取时,必须重新按照OID查找数据
Hibernate的更新操作
当执行DML格式更新数据库,而不是使用常规的更新时,此时可能影响的数据量过多
当再次读取二级缓存时,无论读取曾经修改过的模型的任意数据,全部重新加载
Query q = s.createQuery("update TeacherModel set teacherName=:teacherName where uuid = :uuid");
q.setString("teacherName", "测试更新1");
q.setLong("uuid", 4L);
q.executeUpdate();
查询缓存
查询缓存是将每次查询的SQL语句与查询的结果全部保存起来,一对一
查询缓存开启方式
cfg.xml
<property name="cache.use_query_cache">true</property>
针对某一次的查询设定是否使用查询缓存
Query q = ....
q.setCacheable(true);
Session管理
表现层
页面数据收集,将数据封装后,传递给逻辑层
逻辑层
组合业务功能,将数据传递给数据层
void 转账(){
事务开启
A转账到银行总账号 update
银行总账号转账到B update
事务提交
}
数据层
数据处理
update(){}
解决方案:
针对一次请求,创建一个Session对象
使用线程绑定Session就可以解决上述问题
1.配置cfg.xml,设置开启线程绑定Session
<property name="current_session_context_class">thread</property>
2.获取Session对象
Session s = HibernateUtil.getSf().getCurrentSession();
hibernate学习笔记第七天:二级缓存和session管理的更多相关文章
- HIbernate学习笔记(七) hibernate中的集合映射和继承映射
九. 集合映射 1. Set 2. List a) @OrderBy 注意:List与Set注解是一样的,就是把Set更改为List就可以了 private List< ...
- HIbernate学习笔记(八) hibernate缓存机制
hibernate缓存 一. Session级缓存(一级缓存) 一级缓存很短和session的生命周期一致,因此也叫session级缓存或事务级缓存 hibernate一级缓存 那些方法支持一级缓存: ...
- Hibernate学习笔记二:Hibernate缓存策略详解
一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- Java NIO 学习笔记(七)----NIO/IO 的对比和总结
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- JVM学习笔记-第七章-虚拟机类加载机制
JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...
- Hibernate学习笔记3
---恢复内容开始--- 一.hibernate如何转化jdbc代码实例[通过hibernate构建jdbc后往数据库传对象] import java.sql.Connection;import ja ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
随机推荐
- JAVA核心技术I---JAVA基础知识(抽象类和接口)
一:抽象类 (一)定义 类:属性(0或多个)+方法(0或多个)一个完整(健康)的类:所有的方法都有实现(方法体)类可以没有方法,但是有方法就肯定要有实现,这才是一个完整的类一个完整的类才可以被实例化, ...
- Docker 容器管理
单一容器管理 容器的标识符 每个容器被创建后都会分配一个CONTAINER_ID作为容器的唯一标识符,后续的启动.停止等操作都通过CONTAINER_ID来完成的. CONTAINER_ID很难记忆, ...
- Kafka技术内幕 读书笔记之(四) 新消费者——消费者提交偏移量
消费组发生再平衡时分区会被分配给新的消费者,为了保证新消费者能够从分区的上一次消费位置继续拉取并处理消息,每个消费者需要将分区的消费进度,定时地同步给消费组对应的协调者节点 .新AP I为客户端提供了 ...
- C#设计模式(7)——适配器模式
1.适配器模式介绍 适配器模式的作用是将一个类的接口,转换成客户端希望的另外一种接口,适配器作为原始接口(我们的类中本来具有的功能)和目标接口(客户端希望的功能)之间的桥梁.举个例子:我们知道安卓数据 ...
- 047、管理Docker Machine(2019-03012 周二)
参考https://www.cnblogs.com/CloudMan6/p/7248188.html 用docker-machine创建machine的过程很简洁,非常适合多主机环境.除此之外 ...
- 032、学容器必须懂bridge网络(2019-02-19 周二)
参考https://www.cnblogs.com/CloudMan6/p/7066851.html docker安装时会创建一个名为 docker0 的linuxbridge.如果不指定 --n ...
- UTF8 UTF16 之间的互相转换
首先需要知道 Unicode 编码范围 [U+00, U+10FFFF], 其中 [U+00, U+FFFF] 称为基础平面(BMP), 这其中的字符最为常用. 当然, 这 65536 个字符是远远不 ...
- oracle 远程连接不到dba用户
如果要远程连接192.168.10.44上的oracle,那么192.168.10.44服务器必须启动TNSListener.(配置文件 listener.ora) http://www.111cn. ...
- Debian Security Advisory(Debian安全报告) DSA-4404-1 chromium
Package : chromium CVE ID : CVE-2019-5786 Clement Lecigne在chromium的文件读取器实现中发现了一个use-after-free(释放后重用 ...
- luogu P3704 [SDOI2017]数字表格
传送门 我是真的弱,推式子只能推一半 下面假设\(n<m\) 考虑题目要求的东西,可以考虑每个gcd的贡献,即\[\prod_{d=1}^{n}f[d]^{\sum_{i=1}^{\lfloor ...