EhCache构建Hibernate二级缓存

时间:2021-10-26 16:50:22
1、首先设置EhCache,建立配置文件ehcache.XML,默认的位置在class-path,可以放到你的src目录下:?xml version=1.0 encoding=UTF-8?ehcache ... - Discuz! Board
  
1、首先设置EhCache,建立配置文件ehcache.XML,默认的位置在class-path,可以放到你的src目录下:

<?xml version="1.0" encoding="UTF-8"?>

<ehcache>

       <diskStore path="java.io.tmpdir" />

       <cache name="cache1"

            maxElementsInMemory="10000"<!-- 缓存最大数目 -->

          eternal="false"                      <!-- 缓存是否持久 -->

         overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时-->  

         timeToIdleSeconds="300"  <!-- 当缓存闲置n秒后销毁 -->

         timeToLiveSeconds="500"  <!-- 当缓存存活n秒后销毁-->

     memoryStoreEvictionPolicy="LRU"  <!-- 最近最少使用策略-->

      />

        

</ehcache>2、在Hibernate配置文件中设置:

 <prop key="hibernate.show_sql">true</prop>

    <prop key="hibernate.jdbc.batch_size">100</prop>

    <prop key="hibernate.jdbc.fetch_size">50</prop>

    <prop key="hibernate.cache.use_second_level_cache">

     true

    </prop>

    <prop key="hibernate.cache.use_query_cache">true</prop>

    <prop key="hibernate.cache.provider_class">

     org.hibernate.cache.EhCacheProvider

    </prop>

    <prop key="net.sf.ehcache.configurationResourceName">

     classpath:ehcache.xml

    </prop>3、在Hbm文件中<class>首行下添加

  <cache usage="read-only" region="cache1"/>4使用spring模板时加

<bean id="hibernateTemplate"

class="org.springframework.orm.hibernate3.HibernateTemplate">

<property name="sessionFactory">

<ref bean="sessionFactory" />

</property>

<property name="cacheQueries">

<value>true</value>

</property>

</bean>


如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置
hibernate.cache.use_query_cache true 才行
<prop key="hibernate.cache.use_query_cache">true</prop>

ehcache不支持transactional,其他三种可以支持。
read-only:无需修改, 那么就可以对其进行只读 缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。
read-write:需要更新数据,那么使用读/写缓存 比较合适,前提:数据库不可以为serializable transaction isolation level(序列化事务隔离级别)
nonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,那么比较适合使用非严格读/写缓存策略。
 文章来源:http://jdh.javaeye.com/blog/198726