笔记:Hibernate 二级缓存
Hibernate 包括二个级别的缓存,默认的总是启用Session级别的一级缓存,可选的 SessionFactory 级别的二级缓存,Session级别的一级缓存,但应用保存持久化实体、修改持久化实体时,Session 并不会立即把这种改变 flush 到数据库中,只有程序显示的调用 flush 方法,或者程序关闭 Session 时才会把这些改变一次性的flush到底层数据库。
- 开启二级缓存,需要在 hibernate.cfg.xml 配置文件中设置如下属性:
<property name="hibernate.cache.use_second_level_cache">true</property>
在开启二级缓存后,还需要配置二级缓存的具体实现,Hibernate 提供了三中缓存实现:
- ConcurrentHashMap 缓存,实现类为 org.hibernate.testing.cache.CachingRegionFactory,缓存类型为内存(该缓存只用于测试,不推荐实际项目中使用)
- EhCache 缓存,实现类为 org.hibernate.cache.ehcache.EhCacheRegionFactory,缓存类型为内存、磁盘、事务性、支持群集
- Infinispan 缓存,实现类为 org.hibernate.cache.infinispan.InfinispanRegionFactory,缓存类型为事务性、支持群集
Hibernate.cfg.xml 配置文件中增加如下属性,设置缓存类型:
<property name="hibernate.cache.region.factory_class">[缓存的具体实现类]</property>
要使用 EhCache 缓存,需要复制 Hibernate 目录下的 lib/optional/ehcache 子目录的 jar 包,主要依赖的 jar包如下:
- ehcache-core-2.4.3.jar
- hibernate-ehcache-4.3.11.Final.jar
- slf4j-api-1.6.1.jar
- commons-logging-1.2.jar(需要额外下载:http://commons.apache.org/proper/commons-logging/download_logging.cgi)
- backport-util-concurrent.jar(需要额外下载:https://sourceforge.net/projects/backport-jsr166/files/latest/download)
- 增加配置文件 ehcache.xml 整个配置文件可以在 Hibernate 的 project\etc 路径下找到,示例配置如下:
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>
配置说明如下:
- diskStrore:保存路径配置,path 的值有 user.home(用户的主目录可以使用)、user.dir(用户当前的工作目录)、java.io.tmpdir(默认临时文件路径)
- maxElementsInMemory:设置缓存中最多可以放多少个对象
- eternal:设置缓存是否永久有效
- timeToIdleSeconds:设置缓存对象多少秒没有被使用就会被清理掉
- timeToLiveSeconds:设置缓存对象在过期前可以缓存多少秒
- overflowToDisk:内存中的缓存已达到 maxInMemory 限制,是否可以溢出到磁盘
- diskPersistent:设置缓存对象是否被持久化到硬盘中,保存路径由<diskStore…/>配置决定
- diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
- diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
- memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)、FIFO(先进先出)或是LFU(较少使用)
修改要使用缓存的持久化类文件,使用 Hibernate 提供的 @Cache 注解修饰持久化类,或者使用该注解修饰集合属性,也可以在 hibernate.cfg.xml 文件中使用<class-cache…/>元素对指定的持久化类启用二级缓存,示例配置及代码如下:
<class-cache usage="read-only" class="[缓存持久类完成名称]"/>
二级缓存可以设定以下 4 种类型的并发访问策略, 每一种访问策略对应一种事务隔离级别
- nonstrict-read-write(非严格读写):不保证缓存与数据库中数据的一致性,提供 Read Uncommited 事务隔离级别, 对于极少被修改, 而且允许脏读的数据, 可以采用这种策略
- read-write(读写型):提供 Read Commited 数据隔离级别.对于经常读但是很少被修改的数据, 可以采用这种隔离类型, 因为它可以防止脏读
- Transactional(事务型):仅在受管理环境下适用. 它提供了 Repeatable Read 事务隔离级别. 对于经常读但是很少被修改的数据, 可以采用这种隔离类型, 因为它可以防止脏读和不可重复读
- read-only(只读型):提供 Serializable 数据隔离级别, 对于从来不会被修改的数据, 可以采用这种访问策略
public static void main(String[] args) {
Session curSession = hibernateUtils.openSession();
Calendar calendar = Calendar.getInstance(Locale.CHINA);
try {
// 启用了二级缓存,在查询时需要开启事务
curSession.beginTransaction();
List list = curSession.createQuery("SELECT trm FROM TransitRecordModel trm").list();
System.out.println("Query Size=" + list.size());
curSession.getTransaction().commit();
// 从缓存读取,不查询数据库
TransitRecordModel recordModel = (TransitRecordModel) curSession.load(TransitRecordModel.class,new Integer(259));
System.out.println("RecordID=" + recordModel.getRecordID());
} finally {
if (curSession != null) {
curSession.close();
}
i}
- 管理缓存,Session 级别的一级缓存是局部缓存,只对当前Session有效;SessionFactory 级别的二级缓存是全局缓存,他对所有的Session都有效。
- Session 级别的一级缓存,所有操作的实体,使用 save、update、saveOrUpate、load、get、 list、iterate或者scroll 返回获取一个对象,改对象都会放入Session级别的一级缓存,在Session 调用 flush 或者 close 方法之前,这些对象一直缓存在一级缓存,如果想提前释放缓存,可以调用Session.evict 方法移除某个缓存,或者Session.clear 清除所有缓存
- SessionFactory 级别的二级缓存,如果要对二级缓存进行管理,可以调用 SessionFactory.getCache 方法,获取 cache对象,通过cache的 evictEntity、evictEntityRegion、evictCollection、 evictCollectionRegion 方法来管理缓存
- 统计缓存,开启二级缓存的统计功能,可以查询二级缓存的内容并提供了一些工具方法来分析二级缓存的效果
- 启用二级缓存的统计,在 hibernate.cfg.xml 文件增加如下配置:
<!-- 开启二级缓存的统计功能 -->
<property name="hibernate.generate_statistics">true</property>
<!-- 设置使用结构化方式来维护缓存项-->
<property name="hibernate.cache.use_structured_entries">true</property>
- 通过调用 SessionFactory 类的 getStatistics 返回 Statistics 类,通过 Statistics类可以访问工具方法,来获取缓存效果
笔记:Hibernate 二级缓存的更多相关文章
- js相关(easyUI),触发器,ant,jbpm,hibernate二级缓存ehcache,Javamail,Lucene,jqplot,WebService,regex,struts2,oracle表空间
*********************************************js相关********************************************* // 在指 ...
- Hibernate ——二级缓存
一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...
- 配置Hibernate二级缓存时,不能初始化RegionFactory的解决办法
配置Hibernate 二级缓存时,出现以下bug提示: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder&quo ...
- 配置Hibernate二级缓存步骤
配置Hibernate二级缓存步骤: 加入二级缓存的jar包及配置文件 jar包位置:hibernate-release-4.1.8.Final\lib\optional\ehcache下所有jar包 ...
- Hibernate 二级缓存 总结整理(转)
和<Hibernate 关系映射 收集.总结整理> 一样,本篇文章也是我很早之前收集.总结整理的,在此也发上来 希望对大家有用.因为是很早之前写的,不当之处请指正. 1.缓存:缓存是什么, ...
- Hibernate(十六):Hibernate二级缓存
Hibernate缓存 缓存(Cache):计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如磁盘上的文件或者数据库)之间,起作用是降低应用程序直接读取永久性数据存储源的频率,从而提高应用 ...
- hibernate二级缓存demo2
@Test public void hello3(){ Session session=sessionFactory.openSession(); List list = session.create ...
- hibernate二级缓存整合
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http:// ...
- ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存
ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate : Hibernate是一个持久层框架,经常访问物理数据库 ...
- spring boot集成ehcache 2.x 用于hibernate二级缓存
https://www.jianshu.com/p/87b2c309b776 本文将介绍如何在spring boot中集成ehcache作为hibernate的二级缓存.各个框架版本如下 spring ...
随机推荐
- 微信 Tinker 的一切都在这里,包括源码
最近半年以来,Android热补丁技术热潮继续爆发,各大公司相继推出自己的开源框架.Tinker在最近也顺利完成了公司的审核,并非常荣幸的成为github.com/Tencent上第一个正式公开的项目 ...
- Sublime codeIntel 配置支持php自动提示
Sublime codeIntel 配置支持php自动提示 下载地址:https://github.com/SublimeCodeIntel/SublimeCodeIntel 安装方法:下载后放到su ...
- linux内核initrd文件自定义方法
linux内核initrd文件自定义方法 重新编译内核后,可能加入了自定义的模块,就有可能需要修改init文件,而init文件就在initrd中,这里记录下操作步骤,以防遗忘. 1. cp /bo ...
- Linux 系统裁剪笔记 4 (内核配置选项及删改)
CDROM filesystem support(CONFIG_ISO9660_FS)[Y/m/n/?]有标准光驱的系统应该选Y.Minix fs support(CONFIG_MINIX_FS)[ ...
- Linux显示PCI设备
Linux显示PCI设备 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ lspci -tv -[0000:00]-+-00.0 Advanced Micro ...
- C#利用 string.Join 泛型集合快速转换拼接字符串
C#利用 string.Join 泛型集合快速转换拼接字符串 List<int> superior_list = new List<int>(); superior_list. ...
- CodeM资格赛 Round A 最长树链
按照题解的做法,对于每一个质约数分别进行讨论最长链就行 对于每一个数的质约数可是比logn还要小的 比赛的时候没人写,我也没看 = =,可惜了,不过我当时对于复杂度的把握也不大啊 #include & ...
- Python爬虫 股票数据爬取
前一篇提到了与股票数据相关的可能几种数据情况,本篇接着上篇,介绍一下多个网页的数据爬取.目标抓取平安银行(000001)从1989年~2017年的全部财务数据. 数据源分析 地址分析 http://m ...
- (luogu P4012)深海机器人问题 [TPLY]
网页链接 https://www.luogu.org/problemnew/show/4012 做题背景 在不久的将来,人工智能发展使得人类大量失业,也使得现在的我们做[深海机器人问题]做得想死... ...
- [JSOI2004]平衡点
题面在这里 题意 ...见链接吧 sol 在此发一篇模拟退火的题解 不得不说luogu的数据真是太良心啦 一句话解释模拟退火:在一个慢慢缩小的范围内随机状态寻找最优解,当转移状态更优时直接接受,当当前 ...