现在的位置: 首页 > 综合 > 正文

Hibernate二级缓存-EHCache

2013年03月30日 ⁄ 综合 ⁄ 共 5586字 ⁄ 字号 评论关闭

由于性能原因考虑在项目中使用hibernate二级缓存。网上看了下。EHCache的资料比较多。

 

下面是设置步聚:

一.所需jar包

:hibernate3.jar和ehcache.jar 这两个包在我的项目中已有存在,其中ehcache的jar包版本为1.2.3,也就是ehcache-1.2.3.jar

二.
hibernateProperties或hibernate.cfg.xml配置
,网上资料说要加入下面两句来开启hibernate二级缓存

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

 

         org.hibernate.cache.EhCacheProvider
 </prop>          
 <prop key="hibernate.cache.use_query_cache">
          true
  </prop>
但因为我使用了spring整合hibernate没有使用hibernateProperties或hibernate.cfg.xml这个文件而是把这些配置都放入了spring的配置文件中去了。于下做如下配置
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="houseInfoDS" />
        </property>
        <property name="mappingDirectoryLocations">
            <list>
                <value>
                    classpath:/com/dgsoft/data/biz/info/bo/
                </value>
                <value>classpath:/com/dgsoft/data/biz/record/bo/
                </value>
                <value>classpath:/com/dgsoft/data/system/bo/
                </value>
                <value>classpath:/com/dgsoft/data/biz/wxzj/bo/
                </value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.SQLServerDialect
                </prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.cache.provider_class">
                    org.hibernate.cache.EhCacheProvider
                </prop>
                <prop key="hibernate.cache.use_query_cache">
                    true
                </prop>
            </props>
        </property>
        <property name="jtaTransactionManager" ref="jotm" />
    </bean>
三。设置Spring的hibernateTemplate 加入以下配置
        <property name="cacheQueries">
            <value>true</value>
        </property>
我的配置如下:

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
        <property name="jdbcExceptionTranslator">
            <ref bean="jdbcExceptionTranslator" />
        </property>
        <property name="cacheQueries">
            <value>true</value>
        </property>
    </bean>
注意,要将所有Spring托管的DAO都注入这个hibernateTemplate,而不是sessionFactory 如:
    <bean id="houseInfoDao" class="com.dgsoft.data.biz.info.dao.house.HouseDaoImpl">
        <property name="hibernateTemplate">
            <ref bean="hibernateTemplate" />
        </property>
    </bean>
四.建立ehcache的配置文件ehcache.xml到classPath
这个根据我的理解注解一下(有错误怪)
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <diskStore path="java.io.tmpdir" />  <!-- 当使用文件缓存时,文件的存储位置,可以是path="d://cache" -->
    <cache name="com.dgsoft.data.system.bo.word.WordBook" maxElementsInMemory="10000"
        eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"
        overflowToDisk="true" />
    <!--  这是一个对印的缓存 ,下面是各属性的说明
       name:这个级存的名称,可在pojo的hbm文件中用这个名称来指定所使用的缓存设置,如:<cache usage="read-write" region="com.dgsoft.data.system.bo.word.WordBook"/> 但是这个region也可以不设置,这里有个约定如果没有指定region的话会自动以pojo的class名找chche设置,如果还没找到的话使用下面那个defaultCache的配置。(这里我有个问题,就是这个name是不是非要有包名,不知道只写类名可以找到不?)
     maxElementsInMemory:  缓存中允许创建的最大对象数
    eternal:缓存中对象是否为永久的(表示缓存是不是永远不超时)
     timeToIdleSeconds:缓存数据钝化时间(即对象在它过期前的空闲时间)
      imeToLiveSeconds:缓存数据生存时间(是缓存中每个元素(这里也就是一个POJO)的超时时间,如果eternal="false",超过指定的时间,这个元素就被移走了)
     overflowToDisk:是否启用磁盘缓存(这个不太明白。具休是系统关闭时把cache写入到磁盘,还是当cache容量超出时写入磁盘,又或者是两者皆是?)
-->
    <defaultCache maxElementsInMemory="10000" eternal="false"
        timeToIdleSeconds="300" timeToLiveSeconds="180" overflowToDisk="false" />
   <!--  默认缓存设置,上面说过了,在找不到指定的缓存设置时,使用此设置-->
    <cache name="org.hibernate.cache.UpdateTimestampsCache"
        maxElementsInMemory="5000" eternal="true" overflowToDisk="true" />
    <cache name="org.hibernate.cache.StandardQueryCache"
        maxElementsInMemory="10000" eternal="false" timeToLiveSeconds="120"
        overflowToDisk="true" />
  <!--这两个是查询缓存的配置,好像是hibernate在处理缓存时用到的 -->

</ehcache>


五.修改pojo的hbm设置
1.在要缓存了hbm文件中加入:
<class name="com.dgsoft.data.system.bo.word.WordBook" table="DGWordBook" schema="dbo" catalog="shark">
<cache usage="read-write" region="com.dgsoft.data.system.bo.word.WordBook"/>
注意的是,这个chche一定要加到class的第一句下面,usage的意思引用别人的文章说下:

选择缓存策略依据:
<cache 
    usage="transactional|read-write|nonstrict-read-write|read-only" (1)
/>
ehcache不支持transactional,其他三种可以支持。
read-only:无需修改, 那么就可以对其进行只读

缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。
read-write:需要更新数据,那么使用

/

写缓存

比较合适,前提:数据库不可以为serializable transaction isolation level(序列化事务隔离级别)
nonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,那么比较适合使用非严格读

/

写缓存

策略。
region这个属性的意思上面说过了。是用来在ehcache.xml中查找缓存设置的。
2.集合类型的缓存设置(这个不太明白。如果集合里面的类的pojo已经设置的缓存,为什么还要在引用的地方再设置一次?)引用别人的
<hibernate-mapping>
<class name="Group" table="t_group" lazy="false">
……
<set name="students" cascade="save-update"
inverse="true"   <!--关系由Student维护-->
lazy="true"
>
<cache usage="read-write"/>  //<!--集合中的数据将被缓存-->
<key column="id"/>
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>

设置过程就完成了。由于第一次接触这东东有很多不明白的地方,还请大虾们不吝赐教,
再引用一下别人的提示:

5、 调试时候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操作过程,主要用于调试过程,实际应用发布时候,请注释掉,以免影响性能。

6、 使用ehcache,
打印sql语句是正常的,因为query
cache设置为true将会创建两个缓存区域:一个用于保存查询结果集
(org.hibernate.cache.StandardQueryCache);
另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。请注意:在查询
缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。需要将打印sql语句与最近的cache内
容相比较,将不同之处修改到cache中,所以查询缓存通常会和二级缓存一起使用。


参考文章:
http://blog.csdn.net/yun15291li/archive/2006/02/21/604095.aspx
http://book.51cto.com/art/200804/71581.htm
http://lizwjiang.javaeye.com/blog/34366
http://developer.51cto.com/art/200909/153715.htm
http://www.javaeye.com/topic/18904



 

 

 

 

 

 

 

 

抱歉!评论已关闭.