EhCache配置Hibernate二级缓存

来源:互联网 发布:qq飞车飞舰数据 编辑:程序博客网 时间:2024/05/17 02:59

使用EhCache配置Hibernate二级缓存:

配置Hibernatee二级缓存准备:

1)把ehcache-1.2.3.jar加入到当前应用的classpath中。

2)在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。

  1. <property name="hibernate.cache.provider_class">     
  2. org.hibernate.cache.EhCacheProvider     
  3. </property>   

3)挎贝ehcache.xml文件到类路径(项目工程的src目录下),这个文件在Hibernate安装目录的etc下。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  
  3. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  5. <hibernate-mapping> 
  6. <class name="org.qiujy.domain.cachedemo.Category" table="categories"> 
  7.  
  8. //配置缓存,必须紧跟在class元素后面对缓存中的Category对象采用读写型的并发访问策略  
  9.  
  10. <cache usage="read-write"/> 
  11.  
  12. <id name="id" type="java.lang.Long"> 
  13. <column name="id" /> 
  14. <generator class="native" /> 
  15. </id> 
  16. <!-- 配置版本号,必须紧跟在id元素后面 --> 
  17. <version name="version" column="version" type="java.lang.Long" /> 
  18.  
  19. <property name="name" type="java.lang.String"> 
  20. <column name="name" length="32" not-null="true"/> 
  21. </property> 
  22.  
  23. <property name="description" type="java.lang.String"> 
  24. <column name="description" length="255"/> 
  25. </property> 
  26.  
  27. <set name="products" table="products" cascade="all" inverse="true"> 
  28.  
  29. <cache usage="read-write"/> 
  30.  
  31. <key column="categoryId" not-null="true"/> 
  32. <one-to-many class="org.qiujy.domain.cachedemo.Product"/> 
  33. </set> 
  34.  
  35. </class> 
  36. </hibernate-mapping> 

Product.hbm.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  4. <hibernate-mapping> 
  5. <class name="org.qiujy.domain.cachedemo.Product" table="products"> 
  6.  
  7. <cache usage="read-write"/> 
  8.  
  9. <id name="id" type="java.lang.Long"> 
  10. <column name="id" /> 
  11. <generator class="native" /> 
  12. </id> 
  13. <!-- 配置版本号,必须紧跟在id元素后面 --> 
  14. <version name="version" column="version" type="java.lang.Long" /> 
  15.  
  16. <property name="name" type="java.lang.String"> 
  17. <column name="name" length="32" not-null="true"/> 
  18. </property> 
  19.  
  20. <property name="description" type="java.lang.String"> 
  21. <column name="description" length="255"/> 
  22. </property> 
  23.  
  24. <property name="unitCost" type="java.lang.Double"> 
  25. <column name="unitCost" /> 
  26. </property> 
  27.  
  28. <property name="pubTime" type="java.util.Date"> 
  29. <column name="pubTime" not-null="true" /> 
  30. </property> 
  31.  
  32. <many-to-one name="category" 
  33. column="categoryId" 
  34. class="org.qiujy.domain.cachedemo.Category" 
  35. cascade="save-update" 
  36. not-null="true"> 
  37. </many-to-one> 
  38. <set name="products" table="products" cascade="all" inverse="true">
  39. <!-- Hibernate只会缓存对象的简单属性的值,  
           要缓存集合属性,必须在集合元素中也加入<cache>子元素  
           而Hibernate仅仅是把与当前持久对象关联的对象的OID存放到缓存中。  
    如果希望把整个关联的对象的所有数据都存入缓存,  
    则要在相应关联的对象的映射文件中配置<cache>元素  
               -->
  40.  <cache usage="read-write"/> 
  41. <key column="categoryId" not-null="true"/>
  42. <one-to-many class="org.qiujy.domain.cachedemo.Product"/>
  43. </set> 
  44. </class> 
  45. </hibernate-mapping> 

编辑ehcache.xml文件:

  1. <ehcache> 
  2. <diskStore path="c:\\ehcache\"/> 
  3. <defaultCache 
  4. maxElementsInMemory="10000" 
  5. eternal="false" 
  6. timeToIdleSeconds="120" 
  7. timeToLiveSeconds="120" 
  8. overflowToDisk="true"   
  9. /> 
  10.  
  11. <!-- 设置Category类的缓存的数据过期策略 --> 
  12. <cache name="org.qiujy.domain.cachedemo.Category" 
  13. maxElementsInMemory="100" 
  14. eternal="true" 
  15. timeToIdleSeconds="0" 
  16. timeToLiveSeconds="0" 
  17. overflowToDisk="false" 
  18. /> 
  19.  
  20. <!-- 设置Category类的products集合的缓存的数据过期策略 --> 
  21. <cache name="org.qiujy.domain.cachedemo.Category.products" 
  22. maxElementsInMemory="500" 
  23. eternal="false" 
  24. timeToIdleSeconds="300" 
  25. timeToLiveSeconds="600" 
  26. overflowToDisk="true" 
  27. /> 
  28.  
  29. <cache name="org.qiujy.domain.cachedemo.Product" 
  30. maxElementsInMemory="500" 
  31. eternal="false" 
  32. timeToIdleSeconds="300" 
  33. timeToLiveSeconds="600" 
  34. overflowToDisk="true" 
  35. /> 
  36.  
  37. </ehcache> 

在Spring托管的Hibernate二级缓存
1.在spring的配置文件中,hibernate部分加入 xml 代码 org.hibernate.cache.EhCacheProvider true 
2.为HBM表设置cache策略 xml 代码 
3.在DAO中,调用find方法查询之前,设置使用缓存 Java代码 getHibernateTemplate().setCacheQueries(true);

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

原创粉丝点击