• 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 二级缓存配置及缓存的统计策略相关推荐

  1. Hibernate二级/查询缓存的陷阱

    这篇文章将介绍如何设置Hibernate二级和查询缓存,它们如何工作以及最常见的陷阱. 休眠二级缓存是用于存储实体数据的应用程序级缓存. 查询缓存是一个单独的缓存,仅存储查询结果. 这两个缓存实际上是 ...

  2. MyBatis-25MyBatis缓存配置【集成Redis】

    文章目录 概述 集成步骤 1.添加项目依赖 2. 配置redis 3. 修改PrivilegeMapper.xml中的缓存配置 其他缓存框架 概述 Redis是一个高性能的key-value数据库 M ...

  3. Nginx配置浏览器缓存

    一. 浏览器从哪读取缓存 memory cache 当直接刷新页面的时候,页面资源会从内存中直接获取 disk cache 如果服务器指定了强缓存它会缓存到硬盘上,如果网页关掉再打开浏览器会从磁盘上去 ...

  4. 浏览器的缓存机制 优点 缺点 协商缓存和强缓存 浏览器缓存过程 如何判断强缓存是否过期

    缓存的优点: 减少了不必要的数据传输,节省带宽 减少服务器的负担,提升网站性能 加快了客户端加载网页的速度 用户体验友好 缺点: 资源如果有更改,会导致客户端不及时更新就会造成用户获取信息滞后 当浏览 ...

  5. ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存

    ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate  : Hibernate是一个持久层框架,经常访问物理数据库 ...

  6. hibernate Search 继续研究 增加 hibernate memcache 二级缓存 配置成功 附件maven代码(2)...

    首先安装 memecached 服务端: 之前写过的 文章,centos 安装memcached服务 : http://toeo.iteye.com/blog/1240607 然后 在 前几天的 弄的 ...

  7. 配置Hibernate二级缓存步骤

    配置Hibernate二级缓存步骤: 加入二级缓存的jar包及配置文件 jar包位置:hibernate-release-4.1.8.Final\lib\optional\ehcache下所有jar包 ...

  8. java中一级缓存二级缓存_[Java] hibernate 一级缓存和二级缓存

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  9. Hibernate二级缓存详解

    与Session相对的是,SessionFactory也提供了相应的缓存机制.SessionFactory缓存可以依据功能和目的的不同而划分为内置缓存和外置缓存.  SessionFactory的内置 ...

最新文章

  1. zend studio 函数不提醒 小黄图标 小黄标
  2. 高内聚低耦合_高渗透环氧树脂灌浆料
  3. STM32F0使用LL库实现MS5536C通讯
  4. centos8安装mysql_CentOS8+FreeRadius+Mysql8.0+daloRadius建立Radius服务器
  5. OpenCV训练SVM模型并预测的完整过程
  6. 玩了10小时赛博朋克2077,我觉得很失望
  7. javascript手册安卓版_JavaScript 完全手册(2018版)
  8. Windows域策略设置 禁止客户端上网【全域策略生效】
  9. Doris之Schema Change
  10. 西安后宰门小学_【云端论坛】走向未来的墙中老校 ——后宰门小学“名校+”教育集团云论坛精彩绽放...
  11. 从Java源代码生成类图
  12. C++ auto类型说明符如for(atuo x : s)
  13. Cypress UI 自动化测试框架
  14. t台式计算机如何安装2个硬盘,台式机械硬盘怎么安装?机械硬盘安装图解教程(SATA固态可参考)(2)...
  15. 解决 filezilla 连接服务器失败问题
  16. luckysheet实现在线编辑Excel
  17. Installation Installing SDKMAN
  18. 提高数据中心机房管理效能浅析
  19. 解决启动MySql时出现 2003 - Can't connect to MySQL server on '127.0.0.1'(10038)问题
  20. OpenStack新版UI管理skyline

热门文章

  1. oracle 初始化出错,OCCI编程时,初始化Date种出错
  2. linux移植会话层层协议,Linux内核移植-南京林业大学毕业设计.DOC
  3. awgn信道中的噪声功率谱密度_从OFC2020看高级算法在光通信中的应用
  4. 【项目管理】ITTO-成本管理
  5. 信息系统项目管理师算职称吗
  6. MyBatis中传递数组参数和List参数时if-test判空和判断长度的写法
  7. Winform中通过NPOI导出Excel时通过ICellStyle和IDataFormat格式化日期显示格式
  8. VMware10.0中安装CentOS8时提示客户机操作系统已禁用CPU,请关闭或重置虚拟机
  9. SpringCloud-使用路由网关统一访问接口(附代码下载)
  10. SSM中实现分页与JUnit单元测试