随笔-199  评论-203  文章-11  trackbacks-0

(一)Hibernate的二级缓存策略的一般过程如下:

1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。

2) 把获得的所有数据对象根据ID放入到第二级缓存中。

3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。

4) 删除、更新、增加数据的时候,同时更新缓存。

Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。

(二)什么样的数据适合存放到第二级缓存中?

1 很少被修改的数据

2 不是很重要的数据,允许出现偶尔并发的数据

3 不会被并发访问的数据

4 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

(三)不适合存放到第二级缓存的数据?

1 经常被修改的数据

2 财务数据,绝对不允许出现并发

3 与其他应用共享的数据。

实践部分:

使用EhCache配置二级缓存

配置准备:

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

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

  1. <!--配置缓存插件 -->   
  2. <property name="hibernate.cache.provider_class">   
  3.     org.hibernate.cache.EhCacheProvider   
  4. </property>  

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

配置步骤:

Hibernate允许在类和集合的粒度上设置第二级缓存。在映射文件中,<class>和<set>元素都有一个<cache>子元素,这个子元素用来配置二级缓存。
示例:以category(产品类别)和product(产品)的映射为例:

1) 修改要配置缓存的那个持久化类的对象关系映射文件:

Category.hbm.xml

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

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping>  
    <class name="org.qiujy.domain.cachedemo.Category" table="categories">  
       <!—  
             配置缓存,必须紧跟在class元素后面  
            对缓存中的Category对象采用读写型的并发访问策略  
        -->  
       <cache usage="read-write"/>  
        
       <id name="id" type="java.lang.Long">  
           <column name="id" />  
           <generator class="native" />  
       </id>  
       <!-- 配置版本号,必须紧跟在id元素后面 -->  
       <version name="version" column="version" type="java.lang.Long" />  
        
       <property name="name" type="java.lang.String">  
           <column name="name" length="32" not-null="true"/>  
       </property>  
        
       <property name="description" type="java.lang.String">  
           <column name="description" length="255"/>  
       </property>  
        
       <set name="products" table="products" cascade="all" inverse="true">  
           <!-- Hibernate只会缓存对象的简单属性的值,  
       要缓存集合属性,必须在集合元素中也加入<cache>子元素  
       而Hibernate仅仅是把与当前持久对象关联的对象的OID存放到缓存中。  
如果希望把整个关联的对象的所有数据都存入缓存,  
则要在相应关联的对象的映射文件中配置<cache>元素  
           -->  
           <cache usage="read-write"/>  
            
           <key column="categoryId" not-null="true"/>  
           <one-to-many class="org.qiujy.domain.cachedemo.Product"/>  
       </set>  
        
    </class>  
</hibernate-mapping>

Product.hbm.xml

<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping>  
    <class name="org.qiujy.domain.cachedemo.Product" table="products">  
        
       <cache usage="read-write"/>  
        
       <id name="id" type="java.lang.Long">  
           <column name="id" />  
           <generator class="native" />  
       </id>  
       <!-- 配置版本号,必须紧跟在id元素后面 -->  
       <version name="version" column="version" type="java.lang.Long" />  
        
       <property name="name" type="java.lang.String">  
           <column name="name" length="32" not-null="true"/>  
       </property>  
        
       <property name="description" type="java.lang.String">  
           <column name="description" length="255"/>  
       </property>  
        
       <property name="unitCost" type="java.lang.Double">  
           <column name="unitCost" />  
       </property>  
        
       <property name="pubTime" type="java.util.Date">  
           <column name="pubTime" not-null="true" />  
       </property>  
        
       <many-to-one name="category"  
                column="categoryId"  
               class="org.qiujy.domain.cachedemo.Category"  
               cascade="save-update"  
                not-null="true">  
        </many-to-one>  
        
    </class>  
</hibernate-mapping>

2)编辑ehcache.xml文件:

<ehcache>  
    <diskStore path="c:\\ehcache\"/>  
    <defaultCache  
        maxElementsInMemory="10000"  
        eternal="false"  
        timeToIdleSeconds="120"  
        timeToLiveSeconds="120"  
        overflowToDisk="true"    
        />  
         
    <!-- 设置Category类的缓存的数据过期策略 -->  
    <cache name="org.qiujy.domain.cachedemo.Category"  
        maxElementsInMemory="100"  
        eternal="true"  
        timeToIdleSeconds="0"  
        timeToLiveSeconds="0"  
        overflowToDisk="false"  
        />  
         
     <!-- 设置Category类的products集合的缓存的数据过期策略 -->  
     <cache name="org.qiujy.domain.cachedemo.Category.products"  
        maxElementsInMemory="500"  
        eternal="false"  
        timeToIdleSeconds="300"  
        timeToLiveSeconds="600"  
        overflowToDisk="true"  
        />  
         
    <cache name="org.qiujy.domain.cachedemo.Product"  
        maxElementsInMemory="500"  
        eternal="false"  
        timeToIdleSeconds="300"  
        timeToLiveSeconds="600"  
        overflowToDisk="true"  
        />  
     
</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 才行。

posted on 2009-06-23 17:32 Werther 阅读(1694) 评论(2)  编辑  收藏 所属分类: 21.Hibernate

评论:
# re: Hibernate中二级缓存的配置和使用 2009-06-24 20:22 | 心梦帆影
学习了,谢谢你这么好的文章。有个问题想请教一下:
“并发访问的数据”是什么意思?多个人同时访问同一数据是不是并发访问?  回复  更多评论
  
# re: Hibernate中二级缓存的配置和使用 2009-06-24 21:25 | Werther
@心梦帆影
同时访问一种资源的用户被视为并发访问数据,也就是你所说的,多个人同时访问同一个数据.  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

I'm reading...

Java 60

Head  First SQL

宝贝连接


If you need these books,pls send me emails.
Email:kunpeng.niu@163.com
<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

留言簿(10)

随笔分类(178)

随笔档案(208)

文章档案(1)

新闻档案(6)

相册

1.Java Official Website

2.Java Study Website

3.Java Technic Website

4.Java Video Website

5.Database Website

6.Bookshop Website

7.English Website

8.Friends Link

9.Other Web

积分与排名

  • 积分 - 683783
  • 排名 - 67

最新评论

阅读排行榜

评论排行榜