Hibernate中配置ehcache缓存

在Spring、Hibernate中使用Ehcache缓存

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

EhCache的使用注意点

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

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

 

1、首先要在hibernate.cfg.xml配置文件中添加配置,在hibernate.cfg.xml中的mapping标签上面加以下内容:


<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 缓存类型程序 -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

如果你是整合在spring配置文件中,那么你得配置你的applicationContext.xml中相关SessionFactory的配置

<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>

 

2、在hibernate.cfg.xml配置文件中加入使用缓存的属性

<!-- class-cache config -->  
<class-cache class="com.hoo.hibernate.entity.User" usage="read-write" />

 

当然你也可以在User.hbm.xml映射文件需要Cache的配置class节点下,加入类似如下格式信息:

<cache usage="transactional|read-write|nonstrict-read-write|read-only" />
注意:cache节点元素应紧跟class元素

 

关于选择缓存策略依据:

ehcache不支持transactional,其他三种可以支持。

read- only:无需修改, 可以对其进行只读缓存,注意:在此策略下,如果直接修改数据库,即使能够看到前台显示效果,但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。

read-write:需要更新数据,那么使用读/写缓存比较合适,前提:数据库不可以为serializable transaction isolation level(序列化事务隔离级别)

nonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,那么比较适合使用非严格读/写缓存策略。

 

3、ehcache.xml的配置:

将ehcache.xml文件拷贝到src目录下,其中<diskStore/>为缓存文件存放路径。

<ehcache>
    <diskStore path="f:cache"/>
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />
</ehcache>

特别说明:

如果需要加入查询缓存则加入以下代码:

<!-- 开启查询缓存 -->

<property name="hibernate.cache.use_query_cache">true</property>

调试时候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操作过程,主要用于调试过程,实际应用发布时候,请注释掉,以免影响性能。

使用ehcache,打印sql语句是正常的,因为query cache设置为true将会创建两个缓存区域:一个用于保存查询结果集 (org.hibernate.cache.StandardQueryCache); 另一个则用于保存最近查询的一系列表的时间戳(org.hibernate.cache.UpdateTimestampsCache)。请注意:在查询缓存中,它并不缓存结果集中所包含的实体的确切状态;它只缓存这些实体的标识符属性的值、以及各值类型的结果。需要将打印sql语句与最近的cache内 容相比较,将不同之处修改到cache中,所以查询缓存通常会和二级缓存一起使用。


建 议

1、建议不要使用sql直接执行数据持久化对象的数据的更新,但是可以执行 批量删除。(系统中需要批量更新的地方也较少)

 

2、如果必须使用sql执行数据的更新,必须清空此对象的缓存数据。调用

SessionFactory.evict(class)

SessionFactory.evict(class,id)

等方法。

 

3、在批量删除数据量不大的时候可以直接采用hibernate的批量删除,这样就不存在绕开hibernate执行sql产生的缓存数据一致性的问题。

 

4、不推荐采用hibernate的批量删除方法来删除大批量的记录数据。

原因是hibernate的批量删除会执行1条查询语句外加 满足条件的n条删除语句。而不是一次执行一条条件删除语句!!

当待删除的数据很多时会有很大的性能瓶颈!!!如果批量删除数据量较大,比如超过50,可以采用JDBC直接删除。这样作的好处是只执行一条sql删除语句,性能会有很大的改善。同时,缓存数据同步的问题,可以采用 hibernate清除二级缓存中的相关数据的方法。

调用 SessionFactory.evict(class) SessionFactory.evict(class,id)等方法。

 

所以说,对于一般的应用系统开发而言(不涉及到集群,分布式数据同步问题等),因为只在中间关联表执行批量删除时调用了sql执行,同时中间关联表一般是执行条件查询不太可能执行按id查询。所以,此时可以直接执行sql删除,甚至不需要调用缓存的清除方法。这样做不会导致以后配置了二级缓存引起数据有效性的问题。

 

退一步说,即使以后真的调用了按id查询中间表对象的方法,也可以通过调用清除缓存的方法来解决。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hibernate Ehcache是一种基于缓存的数据库访问技术,用于优化Hibernate框架的性能。Ehcache是一个开源的Java缓存框架,它可以将缓存数据存储在内存,从而加快应用程序的响应速度。Hibernate Ehcache通过将Hibernate实体及其关联对象存储在缓存,从而减少了对数据库的访问次数。这种技术可以显著提高应用程序的性能,并降低数据库负载。同时,Hibernate Ehcache还提供了一些高级功能,如缓存预热、缓存刷新、缓存失效等,使得缓存管理变得更加灵活和有效。 ### 回答2: Hibernate EHCache是一个用于缓存数据的框架。它通过将对象存储在内存,以提高系统性能和响应速度。 Hibernate EHCache提供了一个缓存层,允许Hibernate缓存获取和存储数据,而不必每次都与数据库交互。这样可以减少对数据库的访问次数,提高系统的吞吐量。 EHCache是一个开源的Java缓存框架,它被设计为可插拔的,可以与Hibernate无缝集成。它支持多种缓存策略和过期机制,可以根据需求进行配置。 通过使用Hibernate EHCache,我们可以在Hibernate实现二级缓存Hibernate的一级缓存是SessionFactory级别的缓存,而二级缓存是应用程序级别的缓存EHCache可以作为Hibernate的二级缓存提供支持,减少数据库查询的开销。 使用Hibernate EHCache,我们可以将经常访问的数据存储在缓存,从而提高访问速度。当我们需要访问这些数据时,Hibernate首先会检查缓存是否存在该数据,如果存在,则直接从缓存获取,而不必再与数据库交互。这样可以减少数据库的负载,并提高系统的性能。 总之,Hibernate EHCache是一个更高效地利用内存、提高系统性能和响应速度的缓存框架。它可以与Hibernate无缝集成,并在Hibernate实现二级缓存,减少对数据库的访问次数,提高系统的吞吐量。 ### 回答3: Hibernate Ehcache 是一个用于缓存的Java开源框架,它是 Hibernate 框架的一部分。 在开发过程缓存是提高性能的重要方法之一。Hibernate Ehcache 可以将数据存储在内存,减少与数据库的频繁交互,从而提高系统的响应速度。 使用 Hibernate Ehcache,可以通过配置将需要缓存的对象标记为可缓存。当从数据库加载对象时,Hibernate Ehcache 会将数据缓存到内存,并在下次需要这些对象时直接从缓存获取,而不是再次访问数据库。 Hibernate Ehcache 还支持缓存地关联对象和查询结果。这意味着当查询一个对象时,除了该对象本身会被缓存,其关联的其他对象也会被缓存,从而减少数据库查询次数。 另外,Hibernate Ehcache 还提供了缓存的有效性检查机制。当数据库的数据发生变化时,Ehcache 可以通过监控机制及时更新缓存,保证数据的一致性。 使用 Hibernate Ehcache,可以大大减少系统与数据库之间的交互,提高系统的性能和响应速度。同时,通过有效的缓存策略,可以提供更好的用户体验和用户满意度。 总之,Hibernate Ehcache 是一个强大的缓存框架,它可以与 Hibernate 框架无缝集成,帮助开发者提高系统性能,提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值