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.htm

Hibernate+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文件在哪的主要内容,如果未能解决你的问题,请参考以下文章

hibernate二级缓存配置,系统提示找不到ehcache.xml的配置文件

HIbernate二级缓存

Hibernate二级缓存配置

Hibernate二级缓存配置

Hibernate二级缓存配置

mybatis 一级缓存和二级缓存