`
former
  • 浏览: 95787 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用EhCache1.1与Hibernate所吃的亏

阅读更多

“偶们的系统越来越慢了!”,这是最近一直在我耳边萦绕的一句话,向公司里搞数据库的大牛咨询,发现是一些做汇总的语句在作怪,于是决定将这些数据做缓存。

办法想出来后,做起来也容易了。首先入我“法眼”的是ehcache,我们用hibernate,这个家伙是hibernate默认自带的(我们之前做的缓存是自己写的HashTable)。由于我们没有用spring,否则用EhCacheFactoryBean和EhCacheManagerFactoryBean就方便了,偶自己写的缓存接口也是基于这个的,但现在是奢望了,于是自己写cache的初始化。由于论坛的“代码”功能好像用不了,我简单说一下碰到的问题:

我所有的初始化代码都是老老实实按着ehcache官网上的例子写的,唯一的不同在于我们的ehcache是1.1版的,CacheManager的创建必须要用createCacheManager才可以,而不能用new CacheManager();由于我没有换jar包的权力,于是将就了一下。当我准备好一切并且去调试的时候,发现我总是无法找到自己设置的cache,但是初始化cache的xml时没有任何异常。最后通过debug ehcache1.1的src发现,其CacheManager是sington的,有人在我之前初始化过了ehcache,于是我的初始化动作根本没有做。问题很简单了,是hibernate干的,在初始化时,我们先初始化了hibernate,然后初始化自定义的ehcache缓存,导致了问题, 把初始化的顺序改变一下,问题就解决了。

此时方明白Spring中EhCacheManagerFactoryBean注释中的含义:Note: As of Spring 2.0, this FactoryBean will by default create an independent CacheManager instance, which requires EHCache 1.2 or higher. Set the "shared" flag to "true" to create a CacheManager instance that is shared at the VM level (which is also compatible with EHCache 1.1).

发此文以做提醒自己之用。

分享到:
评论
21 楼 giscat 2007-03-30  
chenqj 写道
其实可以把部分内容静态化,然后include

include和缓存不是同一码事
  各个容器对include处理方式有差异,如果包含中文字符,应该尽量避免使用
20 楼 ahuaxuan 2007-03-30  
giscat 写道
引用
hibernate的二级缓存其实还是很有用的,尤其对于一些字典表,配置表。

  这个属于hibernate系统级的缓存,
   我们讨论的缓存肯定是针对应用级的

这个二级缓存不属于hibernate系统级缓存,二级缓存本来就是应用级缓存,你可以用可以不用,可以对字典表,code表使用,更重要的是可以对业务表中检索很频繁的数据使用,hibernate的一次缓存才是所谓的系统级的缓存
19 楼 chenqj 2007-03-30  
其实可以把部分内容静态化,然后include
18 楼 giscat 2007-03-30  
MVC ,缓存model即可

 
17 楼 former 2007-03-30  
giscat 写道
性能的瓶颈找出来了
对于耗时耗资源的操作做个缓存,效果肯定很明显
 
   model = xx.getModel();
   如果获取model的过程很耗时耗资源,对这个结果集缓存即可
   至于缓存框架,有很多第三方的开源软件
   也可以自己整,一个简单实用的缓存框架核心代码200行左右
 

的确问题找到了,效果肯定是很明显了,从DBA到用户都不抱怨了.

自己整个缓存框架个人觉得没有必要,有重复发明轮子之嫌 .

刚才和boss谈过,他认为做页面缓存也可以,但是现在不必要,要做别的事!呵呵,此问题暂告一段落.
16 楼 giscat 2007-03-30  
性能的瓶颈找出来了
对于耗时耗资源的操作做个缓存,效果肯定很明显
 
   model = xx.getModel();
   如果获取model的过程很耗时耗资源,对这个结果集缓存即可
   至于缓存框架,有很多第三方的开源软件
   也可以自己整,一个简单实用的缓存框架核心代码200行左右
  


 
15 楼 former 2007-03-30  
robbin 写道
缓存实现的层面有很多:

1、对象缓存
由ORM框架提供,透明性访问,细颗粒度缓存数据库查询结果,无需业务代码显式编程。当软件结构按照ORM框架的要求进行针对性设计,使用对象缓存将会极大降低web系统对于数据库的访问请求。因为类似Hibernate这样的ORM,良好的设计数据库结构和利用对象缓存,在大负载网站,能够提供极高的性能。因为使用对象缓存也无需显式编程,所以适用范围也最广泛。

2、查询缓存
对数据库查询结果行集进行缓存,适用于一些耗时,但是时效性要求比较低的场景。iBATIS就只能使用查询缓存,而无对象缓存。查询缓存和对象缓存适用的场景不一样,是互为补充的。

3、片断缓存
针对动态页面的局部片断内容进行缓存,适用于一些个性化但不经常更新的页面(例如博客)。OSCache提供了相当简陋的片断缓存,而RoR则提供了相当好的片断缓存机制。

4、Action缓存
针对URL访问返回的页面结果进行缓存,适用于粗粒度的页面缓存,例如新闻发布。OScache提供了相当简陋的Action缓存(通过web.xml中的配置),而RoR提供了相当好的Action缓存。

缓存不能一概而论,以上每种缓存分别适用于各自的场景,缓存不同的层面。当然你可以在应用程序当中把4种缓存一起用上。


robbin推荐的ror的缓存机制个人很感兴趣,但是在这个项目里没法用了 .自己还是买了<应用rails进行敏捷开发>第一版来学习一下.
14 楼 former 2007-03-30  
giscat 写道
缓存是应用层的事,
  缓存内容,缓存时间,缓存策略,缓存刷新等都可以交给应用层去解决
  hibernate的缓存是一刀切,控制粒度是粗放型的
  缓存这个东西不能滥用,要用在关键的地方
  系统设计人员应该找出性能瓶颈,做出相应的缓存策略
   而不是不管37二十一,啥东西都缓存一把
  
   缓存不要滥用
  

各位刚才的论述给了我1点启发,就是还可以利用页面缓存的方式来处理我遇到的问题.
我现在的处理方式,觉得是robbin所说的对查询结果进行缓存,结果集通过jdbc得到,所以无法使用ibatis(我们的项目是hibernate、jdbc混用).

使用缓存的地方我可能没说清楚,我们有6个表,每张的数据量应该不到千万吧,组成数张视图和实体视图(material view)供查询,而我们的程序再过滤一些条件对这些视图做查询(使用jdbc,查询sql已优化).但我们在一个web页面上会对其中的一张视图做近30次不同条件的查询,并对每个查询结果做汇总(count),在访问量小的时候还好,但是在刚上班有个高峰期,易造成数据库压力大(数据库还有其他工作),于是我们对这些汇总的结果做缓存.

看了刚才大家的回答,我觉得页面缓存可能是个更好的解决方式,需要试一下.
13 楼 shaucle 2007-03-30  
robbin 写道
缓存实现的层面有很多:

1、对象缓存
由ORM框架提供,透明性访问,细颗粒度缓存数据库查询结果,无需业务代码显式编程。当软件结构按照ORM框架的要求进行针对性设计,使用对象缓存将会极大降低web系统对于数据库的访问请求。因为类似Hibernate这样的ORM,良好的设计数据库结构和利用对象缓存,在大负载网站,能够提供极高的性能。因为使用对象缓存也无需显式编程,所以适用范围也最广泛。

2、查询缓存
对数据库查询结果行集进行缓存,适用于一些耗时,但是时效性要求比较低的场景。iBATIS就只能使用查询缓存,而无对象缓存。查询缓存和对象缓存适用的场景不一样,是互为补充的。

3、片断缓存
针对动态页面的局部片断内容进行缓存,适用于一些个性化但不经常更新的页面(例如博客)。OSCache提供了相当简陋的片断缓存,而RoR则提供了相当好的片断缓存机制。

4、Action缓存
针对URL访问返回的页面结果进行缓存,适用于粗粒度的页面缓存,例如新闻发布。OScache提供了相当简陋的Action缓存(通过web.xml中的配置),而RoR提供了相当好的Action缓存。

缓存不能一概而论,以上每种缓存分别适用于各自的场景,缓存不同的层面。当然你可以在应用程序当中把4种缓存一起用上。



还是robbin专业,呵呵

hibernate二级缓存支持1,2,而且经过严格的测试
oscache支持3,4,当然,hibernate的二级缓存极可能就是用的oscache
另外,对于一些小型应用,缓存可能根本起不了作用.

不知javaeye怎么是怎样的一个缓存策略?
12 楼 former 2007-03-30  
downpour 写道
的确是这样,所以在这种情况下,一般会选择一个另外一个不同的缓存策略,比如OSCache。

由于我没有给系统加添jar包的权限,所以只能用现有的ehcache1.1,而且连换成1.2的要求我也没有提.我估计如果我说要换jar,ld们会让我用hashtable实现...
11 楼 shaucle 2007-03-30  
giscat 写道
缓存是应用层的事,
  缓存内容,缓存时间,缓存策略,缓存刷新等都可以交给应用层去解决
  hibernate的缓存是一刀切,控制粒度是粗放型的
  缓存这个东西不能滥用,要用在关键的地方
  系统设计人员应该找出性能瓶颈,做出相应的缓存策略
   而不是不管37二十一,啥东西都缓存一把
  
   缓存不要滥用





  
  
  
  


缓存当然不能滥用,这也是为什么缓存设置很复杂,
但对于一些建议的配制通常还是很有效的
虽然不是很恰当,我还是拿手gc作比方,最好只是配制,不要渗透到代码.
当然,针对性地缓存也是解决之道,如提供自己的clusterlisteners之类,但还是不要渗透到具体的应用层代码中.
10 楼 robbin 2007-03-30  
缓存实现的层面有很多:

1、对象缓存
由ORM框架提供,透明性访问,细颗粒度缓存数据库查询结果,无需业务代码显式编程。当软件结构按照ORM框架的要求进行针对性设计,使用对象缓存将会极大降低web系统对于数据库的访问请求。因为类似Hibernate这样的ORM,良好的设计数据库结构和利用对象缓存,在大负载网站,能够提供极高的性能。因为使用对象缓存也无需显式编程,所以适用范围也最广泛。

2、查询缓存
对数据库查询结果行集进行缓存,适用于一些耗时,但是时效性要求比较低的场景。iBATIS就只能使用查询缓存,而无对象缓存。查询缓存和对象缓存适用的场景不一样,是互为补充的。

3、片断缓存
针对动态页面的局部片断内容进行缓存,适用于一些个性化但不经常更新的页面(例如博客)。OSCache提供了相当简陋的片断缓存,而RoR则提供了相当好的片断缓存机制。

4、Action缓存
针对URL访问返回的页面结果进行缓存,适用于粗粒度的页面缓存,例如新闻发布。OScache提供了相当简陋的Action缓存(通过web.xml中的配置),而RoR提供了相当好的Action缓存。

缓存不能一概而论,以上每种缓存分别适用于各自的场景,缓存不同的层面。当然你可以在应用程序当中把4种缓存一起用上。

9 楼 giscat 2007-03-30  
引用
hibernate的二级缓存其实还是很有用的,尤其对于一些字典表,配置表。

  这个属于hibernate系统级的缓存,
   我们讨论的缓存肯定是针对应用级的
8 楼 downpour 2007-03-30  
hibernate的二级缓存其实还是很有用的,尤其对于一些字典表,配置表。这些表几乎不改动,却要经常查询。这种情况下比较好的一个方式就是在系统初始化的时候做一次全表的loadAll。此时hibernate会填充其二级缓存。在这之后,无论是关联到这些表的查询,或者load,iterate,都会从缓存中拿数据,效率会很高。

当然,我也承认缓存所在的层次越高,其作用越明显,这也就是OSCache比较受到青睐的原因。
7 楼 giscat 2007-03-30  
缓存是应用层的事,
  缓存内容,缓存时间,缓存策略,缓存刷新等都可以交给应用层去解决
  hibernate的缓存是一刀切,控制粒度是粗放型的
  缓存这个东西不能滥用,要用在关键的地方
  系统设计人员应该找出性能瓶颈,做出相应的缓存策略
   而不是不管37二十一,啥东西都缓存一把
  
   缓存不要滥用





  
  
  
  
6 楼 shaucle 2007-03-30  
giscat 写道
在持久层实现缓存实际上没必要
  缓存这一层可以往前挪
  在view,action层实现好一些
  前端控制,这样通用性更好,而且更容易控制,更易实现
 


持久层实现缓存为什么没必要?
hibernate在上面花的功夫可不少!

view等前端缓存是有必要
但我认为在代码中控制始终不当,(想想gc)
前端缓存的优秀方案其实也很多,如oscache标签直接缓存其页面,也可另开线程单独缓存
5 楼 shaucle 2007-03-30  


很多地方都有EHCache 1.2 和EHCache 1.1之间带来的问题.
4 楼 giscat 2007-03-30  
在持久层实现缓存实际上没必要
  缓存这一层可以往前挪
  在view,action层实现好一些
  前端控制,这样通用性更好,而且更容易控制,更易实现
 
3 楼 downpour 2007-03-30  
的确是这样,所以在这种情况下,一般会选择一个另外一个不同的缓存策略,比如OSCache。
2 楼 former 2007-03-29  
andyandyandy 写道
hibernate已经开了缓存,为什么还要自己建呢?


自己建的缓存不是为了Hibernate而建的,而是为了一些与Hibernate无关的对象做缓存.只是利用了Ehcache罢了.问题在于Ehcache1.1只能有一个CacheManager而且是singlton的,如果你之前用Hibernate的默认初始化,那么之后你再怎么指定ehcache的配置文件让它被初始化也无济于事了.

相关推荐

    ehcache-1.1.jar

    6. **与ORM框架的集成**:Ehcache最初在Hibernate中被广泛使用,它作为Hibernate的二级缓存插件,显著提高了数据访问速度。通过配置,Ehcache可以轻松地与其他ORM框架如MyBatis、TopLink等集成。 7. **API使用**:...

    hibernate所需的jar包

    7. **ehcache-1.2.4.jar**:Ehcache是一个广泛使用的内存缓存系统,Hibernate可以集成Ehcache来提高数据读取性能,通过缓存策略减少数据库访问。 8. **hibernate-jpa-2.0-api-1.0.1.Final.jar**:这个jar包包含了...

    Ehcache新手快速入门.docx

    Ehcache允许开发者进行个性化定制,例如更改缓存的存储位置、使用不同的缓存名称,甚至利用Ehcache 1.1版本后引入的特性,如当内存满时将数据自动存储到硬盘,以及更丰富的缓存策略和事件监听器。 总结来说,...

    Ehcache分布式缓存与其在spring中的使用

    作为Hibernate的默认缓存提供者,Ehcache在提高应用程序性能方面发挥着重要作用。 ##### 1.1 原理结构 Ehcache的内部架构主要分为三个层次: - **CacheManager**:作为操作Ehcache的入口,可以通过`CacheManager....

    hibernate-3.2

    hibernate-3.2\lib\antlr-2.7.6.jar hibernate-3.2\lib\...hibernate-3.2\lib\dom4j-1.6.1.jar hibernate-3.2\lib\ehcache-1.1.jar hibernate-3.2\hibernate3.jar hibernate-3.2\lib\log4j-1.2.13.jar

    hibernate-3.22

    hibernate-3.2\lib\antlr-2.7.6.jar hibernate-3.2\lib\...hibernate-3.2\lib\dom4j-1.6.1.jar hibernate-3.2\lib\ehcache-1.1.jar hibernate-3.2\hibernate3.jar hibernate-3.2\lib\log4j-1.2.13.jar

    hibernate-3.2 jar包

    `lib`目录下则包含了与Hibernate 3.2协同工作的其他第三方库,这些库文件是Hibernate正常工作所必需的,例如: 1. `cglib-nodep.jar`: CGLIB是一个代码生成库,用于为Java类创建子类,主要用于Hibernate的动态代理...

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

    **hibernate3.6.0所需jar包详解** Hibernate是一个强大的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为面向对象的代码,极大地简化了数据层的编程工作。在Hibernate 3.6.0版本中,为了实现其功能,...

    ssh框架hibernate所需jar包

    5. **ehcache-1.2.3.jar**:EhCache是Hibernate常用的二级缓存提供商,它可以提高数据访问速度,减少对数据库的直接访问,从而提升系统性能。 6. **commons-collections-2.1.jar**:Apache Commons Collections提供...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day1_day2_day3_day4

    1.1 ORM概述:ORM是Object-Relational Mapping的缩写,它提供了一种将面向对象的编程模型与关系型数据库之间的映射机制,使得开发者可以使用面向对象的方式来操作数据库,避免了繁琐的SQL编写。 1.2 Hibernate概述...

    最新配套的hibernate包,日志为log4j,hibernate二级缓存包等

    commons-logging-1.1.1.jar,dom4j-1.6.1.jar,ehcache-1.5.0.jar,hibernate3.jar,hibernate-jpa-2.0-api-1.0.0.Final.jar,javassist-3.12.0.GA.jar,jta-1.1.jar,slf4j-api-1.6.1.jar,slf4j-log4j12-1.6.1.jar...

    Hibernate 4.0.0 jar包

    描述"hibernate4.0.0必须的jar包文件"表明这些jar文件是开发或运行使用Hibernate 4.0.0的Java项目所必需的。这些文件包含了Hibernate框架的核心组件和依赖库,使得开发者能够方便地在应用程序中集成Hibernate功能。 ...

    Hibernate开发指南

    《Hibernate开发指南》是一本专为Java开发者设计的详尽指南,旨在帮助他们掌握和精通Hibernate框架的使用。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它简化了数据库编程,使得开发者可以使用面向对象的...

    hibernate3.1的jar 很全

    以下JAR包: antlr-2.7.5H3.jar asm.jar cglib-2.1.2.jar commons-collections-2.1.1.jar commons-pool.jar dom4j-1.6.1.jar ehcache-1.1.jar hibernate3.jar jta.jar log4j-1.2.11.jar Standard.jar

    JSF+Spring+Hibernate小例子

    基于网上很多朋友在问JSF+Spring+Hibernate的使用方法,于是抽空写了个小例子希望大家提出宝贵意见。 采用DBUnit测试 mysql数据库脚本: 新建test数据库,初始化脚本 create table tt(id int primary key,name ...

    Hibernate学习.pdf

    ##### 1.1 Hibernate的Lib - **Antlr.jar:** 用于解析SQL语法。 - **Cglib.jar:** 用于动态代理,实现对象增强。 - **Asm.jar:** 字节码操作框架。 - **Asm-attrs.jar:** Asm的一个扩展库,支持更多的字节码操作...

    Hibernate3.6支持核心类库

    添加Hibernate3.6的核心类库,包含:hibernate3.jar、antlr-2.7.6.jar、cglib-nodep-2.1_3.jar、commons-collections-3.1.jar、dom4j-1.6.1.jar、ehcache-1.5.0.jar、hibernate-jpa-2.0-api-1.0.0.Final.jar、...

    hibernate_jar.zip

    hibernate-ehcache-5.0.7.Final.jar hibernate-entitymanager-5.0.7.Final.jar hibernate-envers-5.0.7.Final.jar hibernate-infinispan-5.0.7.Final-tests.jar hibernate-infinispan-5.0.7.Final.jar ...

Global site tag (gtag.js) - Google Analytics