`

Hibernate使用EHcache二级缓存

阅读更多
hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了。
  二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehcache、oscache等,需要设置hibernate.cache.provider_class,我们用ehcache。
  缓存可以简单的看成一个Map,通过key在缓存里面找value。

1、 配置:
Ehcache.xml
<?xml version="1.0" encoding="UTF-8"?> 
<ehcache> 
 <diskStore path="硬盘目录"/> 
  <defaultCache 
   maxElementsInMemory="10000" <!-- 缓存最大数目 --> 
   eternal="false" <!-- 缓存是否持久 --> 
   overflowToDisk="true" <!-- 是否保存到磁盘,当系统当机时--> 
   timeToIdleSeconds="300" <!-- 当缓存闲置n秒后销毁 --> 
   timeToLiveSeconds="180" <!-- 当缓存存活n秒后销毁--> 
   diskPersistent="false" 
   diskExpiryThreadIntervalSeconds= "120"/> 
</ehcache>

defaultCache为默认的缓存策略,可以根据各个不同的实例单独制订缓存策略

2、 Hibernate配置文件中设置
如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置: hibernate.cache.use_query_cache true 才行; 如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性
<prop key="hibernate.cache.use_query_cache">true</prop>
<!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 --> 
<prop key="hibernate.cache.provider_class"> 
    org.hibernat.cache.EhCacheProvider 
</prop>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> 
<property name="sessionFactory"> 
    <ref bean="sessionFactory" /></property> 
<property name="cacheQueries"> 
    <value>true</value> 
</property> 
</bean> 


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"/>

针对实体类缓存
<!-- bean cache configuration -->  
<cache name="com.ou.entity.Biz" maxElementsInMemory="100" eternal="false" timeToIdleSeconds="3600"    timeToLiveSeconds="7200" overflowToDisk="true" /> 

还可以根据各个不同的实例单独制订缓存策略

4、 选择缓存策略依据:
<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:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,那么比较适合使用非严格读/写缓存策略。
5、 调试时候使用log4j的log4j.logger.org.hibernate.cache=debug,在log4j.properties里加上这句log4j.logger.org.hibernate.cache=debug 更方便看到ehcache的操作过程,主要用于调试过程,实际应用发布时候,请注释掉,以免影响性能。
6、 使用ehcache,打印sql语句是正常的,因为query cache设置为true将会创建两个缓存区域:一个用于保存查询结果集 (org.hibernate.cache.StandardQueryCache);另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。请注意:在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。需要将打印sql语句与最近的cache内容相比较,将不同之处修改到cache中,所以查询缓存通常会和二级缓存一起使用

Criteria查询
Session s=HibernateSessionFactory.getSession(); 
Criteria c=s.createCriteria(Resources.class); 
c.setCacheable(true); //添加


5、 SessionFactory也提供了移除缓存的方法
void evict(Class persistentClass) 
Evict all entries from the second-level cache. 
void evict(Class persistentClass, Serializable id) 
Evict an entry from the second-level cache. 
void evictCollection(String roleName) 
Evict all entries from the second-level cache. 
void evictCollection(String roleName, Serializable id) 
Evict an entry from the second-level cache. 
void evictQueries() 
Evict any query result sets cached in the default query cache region. 
void evictQueries(String cacheRegion) 
Evict any query result sets cached in the named query cache region.

但这样做很难维护
分享到:
评论

相关推荐

    Hibernate+ehcache二级缓存技术

    Hibernate+ehcache二级缓存技术 Hibernate+ehcache二级缓存技术

    Hibernate EhCache 二级缓存配置.docx

    EhCache 缓存插件是 Hibernate 框架内置的,对于单机应用推荐使用它做为 Hibernate 的二级缓存。 二、环境配置 要使用 EhCache 二级缓存,需要进行以下环境配置: 1. 安装 MySql 5.0 数据库 2. 安装 Hibernate ...

    struts2+hibernate+ehcache二级缓存

    在提供的压缩包文件中,可能包含了Struts2、Hibernate和Ehcache的配置示例,以及相关的代码片段,用于演示如何集成和使用这些组件实现二级缓存。开发者可以通过分析这些文件,了解具体的实现细节,并在自己的项目中...

    hibernate+ehcache

    一级缓存是每个 Hibernate Session 的私有缓存,而二级缓存则可以跨 Session 共享,Ehcache 就是常见的二级缓存实现。 7. **事务管理**:在整合 Hibernate 和 Ehcache 时,必须注意事务管理,确保缓存与数据库的...

    springmvc4+spring4+hibernate5.1.3+二级缓存ehcache+fastjson配置

    Ehcache是Hibernate的一个可选二级缓存插件,用于存储数据库查询结果,减少对数据库的直接访问。当相同的数据再次被请求时,可以从缓存中快速获取,提高系统响应速度。在不使用缓存的情况下,可以通过配置关闭。 5...

    Ehcache二级缓存.zip

    在这个"Ehcache二级缓存.zip"压缩包中,可能包含了实现Ehcache二级缓存的相关文件,如jar包、配置文件和文档等。 1. **Ehcache二级缓存**:在Java应用中,一级缓存通常指的是JVM内的内存缓存,而二级缓存则可以是...

    hibernate一级缓存和二级缓存的区别与联系

    二级缓存可以是内存中的缓存,也可以扩展到硬盘,例如使用第三方缓存提供商(如 EhCache 或者 Infinispan)。二级缓存中存储的是对象的集合数据,而不是单个对象实例,这样可以更高效地处理大量数据。二级缓存可以...

    hibernate缓存ehcache用法

    Ehcache是Hibernate常用的二级缓存解决方案,它可以提高应用程序的性能和响应速度。这篇博客文章“hibernate缓存ehcache用法”可能详细介绍了如何在Hibernate中配置和使用Ehcache。 首先,我们需要理解什么是缓存。...

    配置EhCache二级缓存

    ### 配置EhCache二级缓存 #### 一、简介 EhCache是一个高性能、易于使用的开源缓存系统,最初由 Terracotta 组织开发。它支持多种缓存模型,包括本地缓存和分布式缓存。由于其简单易用且功能强大,EhCache 成为了 ...

    hibernate4.0使用二级缓存jar包

    ehcache 二级缓存 配置使用的jar包 配置如下: &lt;!-- 启用二级缓存 --&gt; &lt;property name="hibernate.cache.use_second_level_cache"&gt;true &lt;!-- 查询的二级缓存配置 --&gt; &lt;property name="hibernate....

    Spring集成的Hibernate配置二级缓存

    以EhCache为例,我们需要在项目中引入ehcache-core或ehcache的依赖,并在Hibernate配置文件(hibernate.cfg.xml或persistence.xml)中启用二级缓存,添加如下配置: ```xml &lt;property name="hibernate.cache.use_...

    Hibernate + EhCache 实现数据缓存的处理

    - 第二级缓存:SessionFactory实例间的共享缓存,跨Session存储数据,提高多个并发请求的效率。 4. **缓存更新与失效** - 更新策略:当数据发生变化时,需要同步更新缓存,可以使用`@CacheEvict`注解实现缓存的...

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

    5. **实体类注解**:为了让Hibernate知道哪些实体类需要使用二级缓存,可以在实体类上添加`@Cacheable`注解,并指定缓存区域。例如: ```java @Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public...

    hibernate4配置二级缓存

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

    Hibernate4二级缓存Ehcache案例

    Ehcache是Java中广泛使用的内存缓存库,它支持内存和磁盘缓存,具有高效的缓存管理和数据持久化能力,因此被选为Hibernate的二级缓存提供商。要使用Ehcache,我们首先需要在项目中引入Ehcache的依赖。在Maven项目中...

    SSH三层架构MVC,Hibernate(ehcache)二级缓存技术,源代码

    SSH三层架构MVC(struts1.3+spring2.x+hibernate3.2),Hibernate(ehcache)二级缓存技术,Spring 注解形式依赖注入,ehcache缓存 源代码,内有MySql anbyke.sql文件,方便创建数据库演示效果!

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

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

    hibernate一级和二级缓存配置与详解

    本篇将深入探讨Hibernate的一级缓存和二级缓存,以及查询缓存的配置和使用。 ### 一级缓存 一级缓存是Hibernate默认提供的缓存,它是Session级别的,每个Hibernate Session都有一个私有的、本地的一级缓存。当我们...

    Hibernate中二级缓存ehcache缓存案例

    2. **配置hibernate.cfg.xml**:在Hibernate的配置文件中,开启二级缓存支持并指定使用ehcache。添加以下配置: ```xml &lt;property name="hibernate.cache.use_second_level_cache"&gt;true &lt;property name="...

    hibernate一级缓存、二级缓存和查询缓存

    二级缓存的实现需要依赖第三方缓存提供者,如EhCache、Infinispan等。二级缓存的主要特点包括: - **跨事务共享**:与一级缓存不同,二级缓存可以在多个事务之间共享数据,提高了数据的复用性。 - **配置复杂**:二...

Global site tag (gtag.js) - Google Analytics