Java Hibernate 二级缓存配置及缓存的统计策略
- 1、首先要打开二级缓存,在hibernate.cfg.xml中添加如下配置:
- <propertyname="hibernate.cache.use_second_level_cache">true</property>
- 2、Hibernate的二级缓存使用第三方的缓存工具来实现,所以我们需要指定Hibernate使用哪个
- 缓存工具。如下配置指定Hibernate使用EhCache缓存工具。
- <propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
- 3、Hibernate在默认情况下并不会对所有实体对象进行缓存,所以,我们需要指定缓存哪些对象,
- 在实体对象的映射文件中(相应的<class>标签内部),添加如下配置:
- <cacheusage="read-only"/>
- usage="read-only"是“只读”缓存策略。
- 注意,这个<cache>标签只能放在<class>标签的内部,而且必须处在<id>标签的前面!!!
- 这个<cache>标签放在哪些<class>标签下面,就说明会多这些类的对象进行缓存
- 4、对于第3步,有一个可选的方案是在hibernate.cfg.xml文件中指定哪些类的对象需要缓存,
- 而不需要使用<cache>标签来指定。如:
- 在hibernate.cfg.xml中添加如下配置:
- <class-cacheclass="com.bjsxt.hibernate.Classes"usage="read-only"/>
- 注意,这个<class-cache>标签必须放在<mapping>标签的后面!!
1、首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000" <!-- 缓存最大数目 -->
eternal="false" <!-- 缓存是否持久 -->
overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时-->
timeToIdleSeconds="300" <!-- 当缓存闲置n秒后销毁 -->
timeToLiveSeconds="180" <!-- 当缓存存活n秒后销毁-->
diskPersistent="false"
diskExpiryThreadIntervalSeconds= "120"/>
</ehcache>
2、在Hibernate配置文件中设置:
<!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -->
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- 是否使用查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
如果使用spring调用Hibernate的sessionFactory的话,这样设置:
<!--HibernateSession工厂管理 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="datasource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
</props>
</property>
<property name="mappingDirectoryLocations">
<list>
<value>/WEB-INF/classes/cn/rmic/manager/hibernate/</value>
</list>
</property>
</bean>
说明一下:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话, 就需要设置
hibernate.cache.use_query_cache true 才行
3、在Hbm文件中添加<cache usage="read-only"/>
4、如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性
5、实践出真知,给一段测试程序,如果成功的话第二次查询时不会读取数据库
package cn.rmic.hibernatesample;import java.util.List; import org.hibernate.CacheMode; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import cn.rmic.hibernatesample.hibernate.HibernateSessionFactory; import cn.rmic.manager.po.Resources;public class testCacheSelectList ...{/** *//*** @param args*/public static void main(String[] args) ...{// TODO Auto-generated method stub Session s=HibernateSessionFactory.getSession();Criteria c=s.createCriteria(Resources.class);c.setCacheable(true);List l=c.list();// Query q=s.createQuery("From Resources r")// .setCacheable(true) // .setCacheRegion("frontpages") ;// List l=q.list();Resources resources=(Resources)l.get(0);System.out.println("-1-"+resources.getName());HibernateSessionFactory.closeSession();try ...{Thread.sleep(5000);} catch (InterruptedException e) ...{// TODO Auto-generated catch block e.printStackTrace();}s=HibernateSessionFactory.getSession();c=s.createCriteria(Resources.class);c.setCacheable(true);l=c.list();// q=s.createQuery("From Resources r").setCacheable(true) // .setCacheRegion("frontpages");// l=q.list();resources=(Resources)l.get(0);System.out.println("-2-"+resources.getName());HibernateSessionFactory.closeSession();} }
在Hibernate程序中如果配置了二级缓存,想查看一下二级缓存中存放的数据条数,查询时错过的数据条数,缓存命中率等信息,那么该怎么办呢?
在Hibernate的hibernate.cfg.xml文件中,提供了hibernate.generate_statistics属性,该属性提供了Hibernate应用中操作的统计信息,必须在hibernate.cfg.xml文件中进行配置。该属性在配置文件中的默认值是关闭的,因为它会消耗一些资源,但是它很适合在我们开发过程中调试程序时使用。hibernate.cfg.xml文件中的配置如下:
<property name="generate_statistics">true</property/>
这时我们已经将Hibernate的统计信息打开了,接下来我们应该怎样使用它呢?
在org.hibernate.SessionFactory类中提供了一个得到统计信息的方法,该方法返回一个Statistic类型的数据。之后我们通过Statistics对象取出数据操作时的缓存信息。它提供了取出全部统计信息和取出指定缓存的统计信息,例如:我们就想查看二级缓存中的统计信息,那么可以通过方法指定。例如:我们添加一条数据,该方法是addPet(),将该方法放到main()方法中测试,如下:
addPet()方法的实现:
public void addPet(){ // 创建一个Hibernate Configuration类的实例 Configuration config = new Configuration().configure() ; // 创建SessionFactory对象 SessionFactory sf = config.buildSessionFactory() ; // 调用调添加方法 PetDaoImpl petImpl = new PetDaoImpl();
petImpl.add();
// 创建Statistics对象,并通过SessionFactory对象获得统计信息 Statistics st = sf.getStatistics(); // 打印全部统计信息 System.out.println(st); // 打印二级缓存信息 System.out.println(st.getSecondLevelCacheHitCount()); }
将addPet()方法添加到main()方法中进行测试,将会输出统计信息。
转载于:https://www.cnblogs.com/a284628487/archive/2013/02/01/2888473.html
Java Hibernate 二级缓存配置及缓存的统计策略相关推荐
- Hibernate二级/查询缓存的陷阱
这篇文章将介绍如何设置Hibernate二级和查询缓存,它们如何工作以及最常见的陷阱. 休眠二级缓存是用于存储实体数据的应用程序级缓存. 查询缓存是一个单独的缓存,仅存储查询结果. 这两个缓存实际上是 ...
- MyBatis-25MyBatis缓存配置【集成Redis】
文章目录 概述 集成步骤 1.添加项目依赖 2. 配置redis 3. 修改PrivilegeMapper.xml中的缓存配置 其他缓存框架 概述 Redis是一个高性能的key-value数据库 M ...
- Nginx配置浏览器缓存
一. 浏览器从哪读取缓存 memory cache 当直接刷新页面的时候,页面资源会从内存中直接获取 disk cache 如果服务器指定了强缓存它会缓存到硬盘上,如果网页关掉再打开浏览器会从磁盘上去 ...
- 浏览器的缓存机制 优点 缺点 协商缓存和强缓存 浏览器缓存过程 如何判断强缓存是否过期
缓存的优点: 减少了不必要的数据传输,节省带宽 减少服务器的负担,提升网站性能 加快了客户端加载网页的速度 用户体验友好 缺点: 资源如果有更改,会导致客户端不及时更新就会造成用户获取信息滞后 当浏览 ...
- ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存
ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate : Hibernate是一个持久层框架,经常访问物理数据库 ...
- hibernate Search 继续研究 增加 hibernate memcache 二级缓存 配置成功 附件maven代码(2)...
首先安装 memecached 服务端: 之前写过的 文章,centos 安装memcached服务 : http://toeo.iteye.com/blog/1240607 然后 在 前几天的 弄的 ...
- 配置Hibernate二级缓存步骤
配置Hibernate二级缓存步骤: 加入二级缓存的jar包及配置文件 jar包位置:hibernate-release-4.1.8.Final\lib\optional\ehcache下所有jar包 ...
- java中一级缓存二级缓存_[Java] hibernate 一级缓存和二级缓存
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...
- Hibernate二级缓存详解
与Session相对的是,SessionFactory也提供了相应的缓存机制.SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存. SessionFactory的内置 ...
最新文章
- zend studio 函数不提醒 小黄图标 小黄标
- 高内聚低耦合_高渗透环氧树脂灌浆料
- STM32F0使用LL库实现MS5536C通讯
- centos8安装mysql_CentOS8+FreeRadius+Mysql8.0+daloRadius建立Radius服务器
- OpenCV训练SVM模型并预测的完整过程
- 玩了10小时赛博朋克2077,我觉得很失望
- javascript手册安卓版_JavaScript 完全手册(2018版)
- Windows域策略设置 禁止客户端上网【全域策略生效】
- Doris之Schema Change
- 西安后宰门小学_【云端论坛】走向未来的墙中老校 ——后宰门小学“名校+”教育集团云论坛精彩绽放...
- 从Java源代码生成类图
- C++ auto类型说明符如for(atuo x : s)
- Cypress UI 自动化测试框架
- t台式计算机如何安装2个硬盘,台式机械硬盘怎么安装?机械硬盘安装图解教程(SATA固态可参考)(2)...
- 解决 filezilla 连接服务器失败问题
- luckysheet实现在线编辑Excel
- Installation Installing SDKMAN
- 提高数据中心机房管理效能浅析
- 解决启动MySql时出现 2003 - Can't connect to MySQL server on '127.0.0.1'(10038)问题
- OpenStack新版UI管理skyline
热门文章
- oracle 初始化出错,OCCI编程时,初始化Date种出错
- linux移植会话层层协议,Linux内核移植-南京林业大学毕业设计.DOC
- awgn信道中的噪声功率谱密度_从OFC2020看高级算法在光通信中的应用
- 【项目管理】ITTO-成本管理
- 信息系统项目管理师算职称吗
- MyBatis中传递数组参数和List参数时if-test判空和判断长度的写法
- Winform中通过NPOI导出Excel时通过ICellStyle和IDataFormat格式化日期显示格式
- VMware10.0中安装CentOS8时提示客户机操作系统已禁用CPU,请关闭或重置虚拟机
- SpringCloud-使用路由网关统一访问接口(附代码下载)
- SSM中实现分页与JUnit单元测试