`

ehcache for hibernate

阅读更多
1.EhCache是什么
    EhCache是Hibernate的二级缓存技术之一,可以把查询出来的数据存储在内存或者磁盘,节省下次同样查询语句再次查询数据库,大幅减轻数据库压力;

2.EhCache的使用注意点
    当用Hibernate的方式修改表数据(save,update,delete等等),这时EhCache会自动把缓存中关于此表的所有缓存全部删除掉(这样能达到同步)。但对于数据经常修改的表来说,可能就失去缓存的意义了(不能减轻数据库压力);

3.EhCache使用的场合
    3.1比较少更新表数据
        EhCache一般要使用在比较少执行write操作的表(包括update,insert,delete等)[Hibernate的二级缓存也都是这样];
    3.2对并发要求不是很严格的情况
        两台机子中的缓存是不能实时同步的;

4.在项目做的实现
    4.1在工程的src目录下添加ehcache.xml文件,内容如下:
        <?xml version="1.0" encoding="UTF-8"?>
        <ehcache>    
            <diskStore path="java.io.tmpdir" />
          <defaultCache maxElementsInMemory="5"<!--缓存可以存储的总记录量-->
            eternal="false"<!--缓存是否永远不销毁-->
            overflowToDisk="true"<!--当缓存中的数据达到最大值时,是否把缓存数据写入磁盘-->
            timeToIdleSeconds="15"<!--当缓存闲置时间超过该值,则缓存自动销毁-->
                timeToLiveSeconds="120"<!--缓存创建之后,到达该缓存自动销毁-->
          />
        </ehcache>
    4.2在Hibernate.cfg.xml中的mapping标签上面加以下内容:
        <property name="show_sql">true</property>
        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
        <property name="hibernate.cache.use_query_cache">true</property>
    4.3在要缓存的bean的hbm.xml文件中的class标签下加入以下内容:
       <cache usage="read-only" /><!--也可读写-->
    4.4创建DAO,内容如下:
        Session s = HibernateSessionFactory.getSession();
        Criteria c = s.createCriteria(Xyz.class);
        c.setCacheable(true);//这句必须要有
        System.out.println("第一次读取");
        List l = c.list();
        System.out.println(l.size());
        HibernateSessionFactory.closeSession();

        s = HibernateSessionFactory.getSession();
        c = s.createCriteria(Xyz.class);
        c.setCacheable(true);//这句必须要有
        System.out.println("第二次读取");
        l = c.list();
        System.out.println(l.size());
        HibernateSessionFactory.closeSession();
   4.5这时你会看到打印出来的信息为(表示第二次并没有去读库):
        第一次读取
        Hibernate: *******
        13
        第二次读取
        13

配置Spring+hibernate使用ehcache作为second-level cache

大量数据流动是web应用性能问题常见的原因,而缓存被广泛的用于优化数据库应用。cache被设计为通过保存从数据库里load的数据来减少应用和数据 库之间的数据流动。数据库访问只有当检索的数据不在cache里可用时才必要。hibernate可以用两种不同的对象缓存:first-level cache 和 second-level cache。first-level cache和Session对象关联,而second-level cache是和Session Factory对象关联。

        缺省地,hibernate已经使用基于每个事务的first-level cache。 Hibernate用first-level cache主要是减少在一个事务内的sql查询数量。例如,如果一个对象在同一个事务内被修改多次,hibernate将只生成一个包括所有修改的 UPDATE SQL语句。为了减少数据流动,second-level cache在Session Factory级的不同事务之间保持load的对象,这些对象对整个应用可用,不只是对当前用户正在运行的查询。这样,每次查询将返回已经load在缓存 里的对象,避免一个或更多潜在的数据库事务。

下载ehcache,hibernate3.2必须要ehcache1.2以上才能支持。可以修改log4j配置文件log4j.logger.net.sf.hibernate.cache=debug查看日志

1.在类路径上ehcache.xml:

<ehcache>

     <!-- Sets the path to the directory where cache .data files are created.

          If the path is a Java System Property it is replaced by
          its value in the running VM.

          The following properties are translated:
          user.home - User's home directory
          user.dir - User's current working directory
          java.io.tmpdir - Default temp file path -->
     <diskStore path="java.io.tmpdir"/>


     <!--Default Cache configuration. These will applied to caches programmatically created through
         the CacheManager.

         The following attributes are required:

         maxElementsInMemory             - Sets the maximum number of objects that will be created in memory
         eternal                         - Sets whether elements are eternal. If eternal,   timeouts are ignored and the
                                          element is never expired.
         overflowToDisk                  - Sets whether elements can overflow to disk when the in-memory cache
                                          has reached the maxInMemory limit.

         The following attributes are optional:
         timeToIdleSeconds               - Sets the time to idle for an element before it expires.
                                          i.e. The maximum amount of time between accesses before an element expires
                                          Is only used if the element is not eternal.
                                          Optional attribute. A value of 0 means that an Element can idle for infinity.
                                          The default value is 0.
         timeToLiveSeconds               - Sets the time to live for an element before it expires.
                                          i.e. The maximum time between creation time and when an element expires.
                                          Is only used if the element is not eternal.
                                          Optional attribute. A value of 0 means that and Element can live for infinity.
                                          The default value is 0.
         diskPersistent                  - Whether the disk store persists between restarts of the Virtual Machine.
                                          The default value is false.
         diskExpiryThreadIntervalSeconds- The number of seconds between runs of the disk expiry thread. The default value
                                          is 120 seconds.
         -->

     <defaultCache
         maxElementsInMemory="10000"
         eternal="false"
         overflowToDisk="true"
         timeToIdleSeconds="120"
         timeToLiveSeconds="120"
         diskPersistent="false"
         diskExpiryThreadIntervalSeconds="120"/>
       
     <!-- See http://ehcache.sourceforge.net/documentation/#mozTocId258426 for how to configure caching for your objects -->
</ehcache>

2.applicationContext-hibernate.xml里Hibernate SessionFactory配置:

     <!-- Hibernate SessionFactory -->
     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
         <property name="dataSource" ref="dataSource"/>
         <property name="configLocation"><value>classpath:hibernate.cfg.xml</value></property>
         <!-- The property below is commented out b/c it doesn't work when run via
              Ant in Eclipse.   It works fine for individual JUnit tests and in IDEA ??
         <property name="mappingJarLocations">
             <list><value>file:dist/appfuse-dao.jar</value></list>
         </property>
         -->
         <property name="hibernateProperties">
             <props>
                 <prop key="hibernate.dialect">@HIBERNATE-DIALECT@</prop>
                 <!--<prop key="hibernate.show_sql">true</prop>-->
                 <prop key="hibernate.max_fetch_depth">3</prop>
                 <prop key="hibernate.hibernate.use_outer_join">true</prop>
                 <prop key="hibernate.jdbc.batch_size">10</prop>
                 <prop key="hibernate.cache.use_query_cache">true</prop>
                 <prop key="hibernate.cache.use_second_level_cache">true</prop>
                 <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
                 <!--
                 <prop key="hibernate.use_sql_comments">false</prop>
                 -->
                 <!-- Create/update the database tables automatically when the JVM starts up
                 <prop key="hibernate.hbm2ddl.auto">update</prop> -->
                 <!-- Turn batching off for better error messages under PostgreSQL
                 <prop key="hibernate.jdbc.batch_size">0</prop> -->
             </props>
         </property>
         <property name="entityInterceptor">
            <ref local="auditLogInterceptor"/>
         </property>
     </bean>
说明:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置 hibernate.cache.use_query_cache true 才行

3.model类里采用Xdoclet生成*.hbm.xml里的cache xml标签,即<cache usage="read-only"/>

/**
* @hibernate.class table="WF_WORKITEM_HIS"
* @hibernate.cache usage="read-write"
*
*/


4.对于"query cache",需要在程序里编码:

         getHibernateTemplate().setCacheQueries(true);
         return getHibernateTemplate().find(hql);





使用spring和hibernate配置ehcache和query cache

1、applicationContext.xml
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
这两句加到hibernateProperties中
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
   <ref bean="sessionFactory" />
</property>
<property name="cacheQueries">
   <value>true</value>
</property>
</bean>

添加此bean到applicationcontext.xml中。在各个DAO的bean中,更改如下
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
改为
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>

2、ehcache.xml文件放在classes根目录即可

3、pojo与ehcache.xml的配置关系
以com.ce.ceblog.pojos.CeblogJournal为例子
在CeblogJournal.hbm.xml中配置:
<class name="CeblogJournal" table="CEBLOG_JOURNAL" lazy="false">
<cache usage="read-write" region="ehcache.xml中的name的属性值"/>
注意:这一句需要紧跟在class标签下面,其他位置无效。

Ehcache.xml文件主体如下
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="1" timeToLiveSeconds="1" overflowToDisk="true" />
<cache name="com.ce.ceblog.pojos.CeblogJournal" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" />
hbm文件查找cache方法名的策 略:如果不指定hbm文件中的region="ehcache.xml中的name的属性值",则使用name名为 com.ce.ceblog.pojos.CeblogJournal的cache,如果不存在与类名匹配的cache名称,则用 defaultCache。
如果CeblogJournal包含set集合,则需要另行指定其cache
例如CeblogJournal包含ceblogReplySet集合,则需要
添加如下配置到ehcache.xml中
<cache name="com.ce.ceblog.pojos.CeblogJournal.ceblogReplySet"
maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300"
timeToLiveSeconds="600" overflowToDisk="true" />

另,针对查询缓存的配置如下:
<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"/>

4、选择缓存策略依据:
<cache usage="transactional|read-write|nonstrict-read-write|read-only" />
ehcache不支持transactional,其他三种可以支持。
read- only:无需修改, 那么就可以对其进行只读 缓存,注意,在此策略下,如果直接修改数据库,即使能够看到前台显示效果,但是将对象修改至cache中会报error,cache不会发生作用。另:删 除记录会报错,因为不能在read-only模式的对象从cache中删除。
read-write:需要更新数据,那么使用读/写缓存 比较合适,前提:数据库不可以为serializable transaction isolation level(序列化事务隔离级别)
nonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,那么比较适合使用非严格读/写缓存策略。

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中,所以查询缓存通常会和二级缓存一起使用。

分享到:
评论

相关推荐

    hibernate所需的ehcache的相关jar包,一共3个jar包

    3. **slf4j-api**: Simple Logging Facade for Java (SLF4J) 是一个日志API接口,Ehcache在运行过程中可能会产生一些日志信息。slf4j-api.jar提供了日志框架的抽象,允许用户选择自己喜欢的日志实现。在使用Ehcache...

    第29讲--为Spring集成的Hibernate配置二级缓存

    总结来说,为Spring集成的Hibernate配置二级缓存涉及到引入缓存提供者依赖、修改Hibernate和Spring配置文件、在实体类上添加缓存注解以及配置Ehcache的详细设置。通过这些步骤,我们可以有效地提高数据访问效率,...

    Beginning Hibernate For Hibernate 5 (4th Edition) + Source Code

    进一步,你将学习到Hibernate的缓存机制,包括一级缓存和二级缓存,以及如何集成第三方缓存解决方案,如 Ehcache 或 Infinispan,以提高应用性能。这有助于减少数据库的负载,提高响应速度。 高级主题包括关联映射...

    Ehcache经典中文教程

    在实际应用中,Ehcache 可以与 Spring、Hibernate 等框架集成,提供更高效的数据缓存解决方案。通过合理配置和使用 Ehcache,开发者可以显著提升应用程序的性能,减少对数据库的依赖,提高系统响应速度。

    ehcache所需jar包

    此外,还应考虑与其他依赖项(如Spring、Hibernate等)的集成,以在更复杂的应用场景下使用Ehcache。 在实际应用中,Ehcache不仅可以用于Web应用程序,还可以用于服务端数据处理、数据检索服务等。通过合理地设置...

    ehcache需要的包和文件

    - Hibernate:对于ORM框架如Hibernate,Ehcache可以作为二级缓存,通过`hibernate-ehcache.jar`。 6. **最佳实践**: - 恰当设置缓存大小以平衡性能与内存使用。 - 使用适当的缓存策略以防止缓存击穿或缓存雪崩...

    hibernate5.3 jar包

    4. **Caching增强**:支持了更多缓存提供商,如Infinispan和Ehcache,使得数据缓存更加高效,减少了对数据库的访问压力。 5. **Type系统**:引入了更强大的类型系统,包括对Java 8日期时间API的原生支持,以及对...

    HIBERNATE FOR NETBEANS 数据操作方法

    **Hibernate for NetBeans 数据操作方法** Hibernate 是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。NetBeans 是一款强大的集成开发环境(IDE),提供了丰富的功能来支持...

    hibernate相关jar包

    3. **Ehcache**: Ehcache是流行的一种Java缓存解决方案,常与Hibernate结合使用,实现二级缓存。它可以提高数据库查询的性能,减少对数据库的直接访问。Hibernate通过插件机制支持Ehcache,将频繁访问的数据存储在...

    hibernate-release-5.0.7.Final的所有jar包

    5. **hibernate-c3p0**和**hibernate-ehcache**: 这两个是连接池和缓存服务的提供者,分别对应C3P0和Ehcache。它们用于优化数据库连接的获取和释放,以及缓存数据,提高性能。 6. **hibernate-commons-annotations*...

    Ehcache 整合Spring 使用页面、对象缓存

    - **与Spring、Hibernate的集成**:Ehcache可以非常容易地与Spring和Hibernate框架集成,简化缓存的配置和使用。 #### 二、准备工作 在开始使用Ehcache之前,需要先完成以下准备工作: 1. **下载JAR包**: - **...

    SSM+ehcache-Jar包

    Spring还提供了大量的DAO和JDBC抽象,简化了数据库操作,同时支持多种持久层框架如Hibernate和Mybatis的集成。 2. **SpringMVC**:是Spring框架的一部分,专门用于处理Web请求。它采用模型-视图-控制器(MVC)架构...

    hibernate的jar包

    6. `ehcache-2.10.6.jar`:EhCache是Hibernate常用的二级缓存插件,它可以提高数据访问速度,减少对数据库的压力。 7. `javassist-3.20.0-GA.jar`:Hibernate使用javassist动态生成代理类,实现懒加载和CGLIB增强...

    hibernate框架jar包

    Hibernate可以利用EhCache来缓存实体,减少对数据库的访问。 7. **javassist.jar**:Javaassist是一个动态类文件修改工具,Hibernate利用它在运行时生成代理类,实现延迟加载(Lazy Loading)和其他高级特性。 8. ...

    hibernate开发所需包

    8. `ehcache-1.6.2.jar`:EhCache是一个开源的分布式内存缓存系统,Hibernate利用它来实现对象的缓存,提高数据访问速度。 9. `commons-logging-1.2.jar`:Apache Commons Logging库,提供一个简单但灵活的日志记录...

    Hibernate二级缓存技术

    – 设置Hibernate缓存提供者为EhCache –&gt; &lt;property name="cache.provider_class"&gt;org.hibernate.cache.EhCacheProvider &lt;!– 启用查询缓存 –&gt; &lt;property name="hibernate.cache.use_query_cache"&gt;true ``` 同时...

    hibernate框架完整包

    SLF4J(Simple Logging Facade for Java)是一个日志门面,它为各种日志API提供一个简单统一的接口,使得最终的用户能够在部署的时候配置自己希望的日志框架。 4. **DOM4J**:DOM4J是一个强大的Java XML API,它...

    hibernate3资源包

    9. **slf4j-api.jar**和**slf4j-log4j12.jar**:Simple Logging Facade for Java,提供了日志记录接口,通常与Log4j结合使用,方便调试和追踪错误。 10. **asm.jar**和**asm-tree.jar**:ASM库用于字节码操作,...

    hibernate所需jar包资源

    9. **ehcache.jar**:EhCache是一个内存缓存系统,它可以被Hibernate用来缓存查询结果,提高数据访问速度。 10. **antlr-2.7.7.jar**:ANTLR是一个强大的解析器生成器,Hibernate使用它来解析HQL和Criteria查询。 ...

    hibernate3.6.0所需jar包(并且有关于相关jar包的说明)

    6. **ehcache-2.6.9.jar**:EhCache是一个内存缓存系统,用于提高数据访问速度。Hibernate可以利用它来缓存查询结果,减少数据库访问。 7. **javassist-3.18.1-GA.jar**:Hibernate使用javassist动态生成代理类,...

Global site tag (gtag.js) - Google Analytics