hibernate二级缓存,ehcache.xml文件在哪
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate二级缓存,ehcache.xml文件在哪相关的知识,希望对你有一定的参考价值。
合理的缓存应用可以极大地提高系统性能,最简单的是在应用层面做缓存(越高层面做缓存,效果往往越好),直接将数据缓存到服务器中,以全局map方式存储。在使用的时候直接从缓存的map中取,而不用连接数据库,从而提升性能。这种方式简单易行,但是map常驻服务器内存,并且在数据变更(增删改)的时候要手动更新map。还有一种方式比较通用,就是使用Hibernate二级缓存(SessionFactory级别的全局缓存,进程或集群级别),是一种通用缓存(一级缓存就不说了,Session级别缓存,hibernate自己管理),hibernate二级缓存多应用在多读少写的实体对象中,比如组织机构和系统字典。本文使用hibernate注解方式使用二级缓存,做一个说明(使用Ehcache)。1、添加ehcache.xml配置文件2、hibernate配置文件中,配置Ehcache相关属性hibernate.cache.use_second_level_cache=truehibernate.cache.use_query_cache=truehibernate.cache.provider_class=org.hibernate.cache.EhCacheProviderhibernate.generate_statistics=true调试的时候,可以设置log4j的log4j.logger.org.hibernate.cache=debug(记录二级缓存的活动),实际发布的时候,注释掉,以免影响性能。3、pom文件中引入相应jar包(Maven项目,如果还在手动添加jar包的,可以尝试使用maven)org.hibernatehibernate-ehcache3.6.9.Final4、注解方式配置实体配置了二级缓存后,并不是对所有的实体使用,而是需要指定哪些实体需要用到。如果不配置查询缓存(查询缓存会在下面讲到),则只会在根据id查询的操作中,缓存对象。在实体上配置@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)并指定缓存并发策略。@Entity@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)@Table(name="base_dict")@JsonIgnoreProperties(value="hibernateLazyInitializer","handler","fieldHandler","parentDict")publicclassDictimplementsSerializable/****/privatestaticfinallongserialVersionUID=5569761987303812150L;@Id@Column(name="id",length=36)@GeneratedValue(generator="uuid")@GenericGenerator(name="uuid",strategy="org.hibernate.id.UUIDGenerator")@JsonProperty("id")privateStringid;/**字典名称*/@ForeignShow@Column(name="name",length=200)privateStringname;5、查询缓存的使用Queryquery=session.createQuery(hql);query.setCacheable(true);//启用查询缓存query.setCacheRegion(“queryCacheRegion”);//设置查询缓存区域(数据过期策略)QueryCache只是在特定的条件下才会发挥作用,而且要求相当严格:(1)完全相同的HQL重复执行。(注意,只有hql)(2)重复执行期间,QueryCache对应的数据表不能有数据变动(比如添、删、改操作)绝大多数的查询并不能从查询缓存中受益,所以Hibernate默认是不进行查询缓存的。查询缓存适用于以下场合:(1)在应用程序运行时经常使用的查询语句(参数相同)(2)很少对与查询语句检索到的数据进行插入、删除或更新操作query.list(); 参考技术A 找到了使用二级缓存的相关资料。我就不贴过过来了。自己 去看http://developer.51cto.com/art/201202/315922.htmHibernate+EhCache配置二级缓存
步骤:
第一步:加入ehcache.jar
第二步: 在src目录下新建一个文件,名为:ehcache.xml
第三步:在hibernate配置文件的<session-factory>下配置
配置的具体信息:
ehcache.xml的具体配置:
<?xml version="1.0" encoding="UTF-8"?> <!-- maxEntriesLocalHeap: 在内存中缓存的element的最大数目。 maxEntriesLocalDisk: 在磁盘上缓存的element的最大数目,默认值为0,表示不限制。 eternal: 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效, 如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。 timeToIdleSeconds="10" 缓存空闲时间 默认值0 一直存活 timeToLiveSeconds="15" 缓存最大存活时间 默认值0 一直存活 diskExpiryThreadIntervalSeconds:磁盘数据的有效时间 memoryStoreEvictionPolicy="LFU" FIFO ,first in first out (先进先出). LFU , Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。 LRU ,Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了, 而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。 <persistence strategy="localTempSwap"/> 内存存满后将数据存入硬盘 --> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"> <!-- <diskStore path="java.io.tmpdir"/> --> <diskStore path="E:\\cache4"/> <defaultCache maxEntriesLocalHeap="2" maxEntriesLocalDisk="10000000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskSpoolBufferSizeMB="30" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </defaultCache> </ehcache>
在hibernate中的配置:
<!-- 开启二级缓存 --> <property name="hibernate.cache.use_second_level_cache">true</property> <!-- 二级缓存类别:EhCache,OSCache,JbossCache --> <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
以上是关于hibernate二级缓存,ehcache.xml文件在哪的主要内容,如果未能解决你的问题,请参考以下文章