由于性能原因考虑在项目中使用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>
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>
<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>
<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>
<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" -->
<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" />
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" />
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>
</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