分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

Hibernate缓存

发布时间:2023-09-06 01:43责任编辑:董明明关键词:缓存Hibernate
???????????Hibernate中用到了缓存的概念,那么什么是缓存呢?这里介绍的缓存并不是指计算机的内存或者CPU的一二级缓存,这里的缓存是指为了降低程序对物理数据源访问的频次,从而提高程序运行性能的一种策略。 ???????????一级缓存: ???????????首先我们来看下面这个例子。 ???????????@Test ?????????????public void testCache() { ?????????????????????Session session = getSession(); ?????????????????????Employee emp = session.get(Employee.class, 1); ?????????????????????System.out.println(emp.getEmpname()); ?????????????????????emp = session.get(Employee.class, 1); ?????????????????????System.out.println(emp.getEmpname()); ?????????????} ?????????????(截图上传出现问题) ???????????可以看到控制台只打印了一次查询的SQL,这说明用Session第一次查询到empid为1的对象之后这个对象被缓存起来了,第二次查询的时候直接从缓存中获取相应的对象,而不是再查一次数据库。这个例子表明Hibernate的缓存是与Session有关的。 ???????????二级缓存: ???????????Hibernate的二级缓存不是默认的,它不由框架包含而是由第三方组件提供,是一个可插拔式缓存,Hibernate默认提供了一种缓存组件EHCache,同时还支持其他的二级缓存组件,例如Hashtable、OSCache等;二级缓存又称为“全局缓存”、“应用级缓存”,它的数据可适用范围是当前应用的所有会话,这与一级缓存只适用于当前会话内不同。下面我们来看看EHCache的使用。 ???????????使用EHCache分为下面几个步骤: ???????????1、引入对应的jar包; ???????????2、在hibernate.cfg.xml文件中添加相应的配置; ???????????3、添加ehcache.xml配置文件; ???????????4、在需要缓存的表对应的映射文件中添加<cache/>标签。 ???????????首先我们需要导入相应的jar包,要使用EHCache,需要在pom.xml文件中添加下面两个依赖。 ???<dependency> ?????<groupId>net.sf.ehcache</groupId> ?????<artifactId>ehcache</artifactId> ?????<version>2.10.2</version> ???</dependency> ?<dependency> ?????<groupId>org.hibernate</groupId> ?????<artifactId>hibernate-ehcache</artifactId> ?????<version>5.2.3.Final</version> ?</dependency> ?????????????接下来我们需要在hibernate.cfg.xml中添加相应的配置,我们需要添加如下配置 ???????????<property name="hibernate.cache.use_second_level_cache">true</property> ?

<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> ?
<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>

 ???????????在这里需要注意一下Hibernate 4.0及以后的需要按照上面的配置,而Hibernate 3.3 的配置是这样的 ???????????<property name="hibernate.cache.use_second_level_cache">true</property> ?

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> ?

 ???????然后我们需要添加ehcache.xml配置文件,这个配置文件要放在src目录下 ???????<?xml version="1.0" encoding="UTF-8"?> ?

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"> ?
<diskStore path="java.io.tmpdir"/> ?

<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/> ?<!-- ??????配置自定义缓存 ?????maxElementsInMemory:缓存中允许创建的最大对象数 ?????eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。 ?????timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前, ?????????????????两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效, ?????????????????如果该值是 0 就意味着元素可以停顿无穷长的时间。 ?????timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值, ?????????????????这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。 ?????overflowToDisk:内存不足时,是否启用磁盘缓存。 ?????memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。 ?--> ?<cache name="Employee" ??????maxElementsInMemory="10000" ??????eternal="false" ?????overflowToDisk="false" ??????timeToIdleSeconds="900" ??????timeToLiveSeconds="1800" ?????memoryStoreEvictionPolicy="LFU" /> ?

</ehcache>

最后我们需要在需要缓存的表对应的映射文件中添加<cache/>标签,在这个例子中我们要对Employee进行缓存,所以我们在Employee.hbm.xml文件中添加如下内容。 ???????<cache usage="read-only" include="all" region="Employee"/> ????????其中usage属性指定缓存策略,可选的策略包括transactional,read-only,read-write和nonstrict-read-write;region属性指定二级缓存区域名,指定了二级缓存区域名之后就可以在ehcache.xml中配置相应的自定义缓存了;include表示指定是否缓存延迟加载的对象,all表示缓存所有对象,non-lazy表示不缓存延迟加载的对象。

所有都配置完成后我们可以通过下面这个测试方法来进行测试

 ???????@Test ?

public void testCache2() { ?
Session session = getSession(); ?
Employee emp = session.get(Employee.class, 1); ?
System.out.println(emp.getEmpname()); ?

session = getSession(); ?emp = session.get(Employee.class, 1); ?System.out.println(emp.getEmpname()); ?

} ?
运行程序,与一级缓存不同的是当使用不同的Session查询同一对象时不再多次查询数据库,而是直接使用缓存。
那么通常什么类型的数据可以使用到二级缓存呢?通常很少被修改的数据、不是很重要的数据、允许偶尔出现并发的数据和参考数据可以使用二级缓存。

Hibernate缓存

原文地址:http://blog.51cto.com/doctorcai/2073868

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved