`
gaozzsoft
  • 浏览: 424893 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Hibernate3.X二级缓存的使用

阅读更多
(一)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缓存插件的提供类。
<!--配置缓存插件 -->
<property name="hibernate.cache.provider_class">
    org.hibernate.cache.EhCacheProvider
</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 代码
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>  
    <prop key="hibernate.cache.use_query_cache">true</prop>  

2.为HBM表设置cache策略

xml 代码
<cache usage="nonstrict-read-write"/>  

3.在DAO中,调用find方法查询之前,设置使用缓存

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

相关推荐

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    通过以上步骤,我们就成功地在Spring Boot 2.1.4.RELEASE项目中配置了使用Redis作为Hibernate二级缓存的环境。这将显著提升数据库查询效率,减少对数据库的压力,尤其在高并发场景下,效果尤为明显。记得在实际生产...

    hibernate4.x jar

    4. 第二级缓存:Hibernate 支持第二级缓存,可以提高数据读取性能。它允许将频繁访问的对象存储在缓存中,减少对数据库的直接访问。 5. JPA 兼容性:Hibernate 4.x 遵循Java Persistence API(JPA)标准,这意味着...

    hibernate3全部jar包:hibernate3.jar.zip 下载

    Hibernate3还支持第二级缓存,这可以显著提高性能,特别是在多用户并发访问相同数据的情况下。通过集成第三方缓存提供商,如Ehcache,可以实现这一功能。此外,Hibernate3提供了强大的关联映射功能,如一对一、一对...

    为Spring集成的Hibernate配置二级缓存

    3. **配置Spring**:在Spring的配置文件(如`applicationContext.xml`)中,配置Hibernate SessionFactory,并注入二级缓存配置。以下是一个配置示例: ```xml &lt;bean id="sessionFactory" class="org.spring...

    Hibernate 3.x 参考手册

    - **二级缓存和查询缓存** - 配置缓存策略提高性能。 - 示例: ```xml &lt;property name="cache.provider_class"&gt;org.hibernate.cache.ehcache.EhCacheProvider ``` - **查询语言替换** - 替换 HQL 或 SQL 中的...

    hibernate3.x参考文档

    11. **缓存机制**:Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的)。缓存可以提高数据读取效率,减少对数据库的访问。 12. **事件监听**:Hibernate允许注册事件监听器,如...

    Spring3.1.1+Struct+hibernate3.x必须的jar包

    Hibernate3.x支持实体类、HQL(Hibernate查询语言)、Criteria查询和二级缓存,极大地简化了数据访问层的实现。在项目中,通常会包含如hibernate-core、hibernate-entitymanager等核心库,以及如jta、ejb3-...

    Hibernate3.x总结

    ### Hibernate3.x总结 #### 一、概述与配置 Hibernate 是一个开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 应用程序中的对象映射到数据库表及其字段上,从而简化了数据访问层的开发工作。本节主要介绍 ...

    hibernate4配置二级缓存

    通过以上步骤,你就可以成功地在Hibernate4项目中配置并使用Ehcache作为二级缓存。不过,需要注意的是,二级缓存并不能保证数据的一致性,因为它是异步更新的。在某些需要强一致性的场景下,可能需要谨慎使用或结合...

    reference manual for hibernate 3.x.rar

    9. **Second-Level Cache**:学习二级缓存(Second-Level Cache)的配置和使用,以提升应用程序性能。 10. **性能优化**:掌握如何优化Hibernate应用,包括批处理、延迟加载(Lazy Loading)、预加载(Eager ...

    hibernate配置二三级缓存

    为了提高应用程序的性能,Hibernate支持多种级别的缓存机制,其中最为常见的是二级缓存。此外,还有一些场景下会用到所谓的“三级缓存”,虽然这一术语在官方文档中并未明确提及,但在实际应用中通常指的是查询缓存...

    我见过的最好的最详细的hibernate3.6.X学习资料(汤阳光)

    - Hibernate因其强大功能和成熟度而受到广泛欢迎,它提供了丰富的查询语言(HQL)和Criteria API,支持事务管理,以及二级缓存等特性,极大地简化了Java应用的数据访问层开发。 总结来说,hibernate3.6.X是Java...

    hibernate3.6.10.Final

    6. **缓存机制**:一级缓存由SessionFactory管理,二级缓存可配置第三方缓存服务如Ehcache,提高性能。 7. **事件监听**:可以通过实现特定接口或者使用注解,实现在对象生命周期中的不同阶段执行自定义逻辑。 8. **...

    Spring 3.1.x + Hibernate 4.2.x+JBPM 5.2 + Ecache例子源码

    在Spring和Hibernate环境中,Ecache可以作为二级缓存,存储查询结果,减少对数据库的访问。这有助于降低系统负载,提升响应速度。 在描述中提到的链接"http://panyongzheng.iteye.com/blog/1872035"可能是一个博客...

    妙解HIBERNATE 3.X:叩响面向对象思想之门

    6. 第二级缓存:为了提高性能,Hibernate提供了二级缓存机制,允许将经常访问的数据存储在内存中,减少对数据库的直接访问。 7. 事务管理:Hibernate提供了基于JTA或 JDBC 的事务管理,确保数据操作的原子性和一致...

    SSH/SSJ整合,Spring 3.1.0M1,Hibernate 3.X,struts2.1.8

    同时,优化了缓存机制,支持第二级缓存和查询缓存,提高了应用性能。 Struts2作为MVC(模型-视图-控制器)框架,2.1.8版本提供了增强的Action和结果处理,以及更丰富的拦截器库。它通过OGNL(Object-Graph ...

    详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    Ehcache 是一个纯 Java 的缓存框架,既可以当做一个通用缓存使用,也可以作为 Hibernate 的二级缓存使用。缓存数据可选择如下三种存储方案: 1. MemoryStore – On-heap memory used to hold cache elements. This ...

    Hibernate中文3.X讲义

    ### Hibernate 3.X 讲义知识点详解 #### 一、JDBC与Hibernate的对比 **JDBC的缺点:** 1. **SQL语法不统一:** JDBC定义了数据库的访问标准,但不同数据库的SQL语法存在差异,这导致了在跨数据库操作时需要编写...

    hibernate_3.2官方开发包

    9. **Caching缓存**:Hibernate支持二级缓存,可以集成第三方缓存系统,如 Ehcache,以进一步提升性能。 10. **Callback事件**:Hibernate允许在对象生命周期中的特定时刻(如加载、保存、更新和删除)注册回调方法...

    struts1.x+spring+hibernate集成例子(包含所有jar包,ehcache二级缓存)

    Ehcache 的引入是为了实现二级缓存,提高数据读取速度。它可以在内存中存储常用数据,减少对数据库的访问。Hibernate 可以与 Ehcache 集成,将频繁查询的结果缓存起来,当相同的查询再次发生时,直接从缓存中获取,...

Global site tag (gtag.js) - Google Analytics