论坛首页 Java企业应用论坛

使用EhCache1.1与Hibernate所吃的亏

浏览 13180 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-30  
缓存实现的层面有很多:

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

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

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

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

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

0 请登录后投票
   发表时间:2007-03-30  
giscat 写道
缓存是应用层的事,
  缓存内容,缓存时间,缓存策略,缓存刷新等都可以交给应用层去解决
  hibernate的缓存是一刀切,控制粒度是粗放型的
  缓存这个东西不能滥用,要用在关键的地方
  系统设计人员应该找出性能瓶颈,做出相应的缓存策略
   而不是不管37二十一,啥东西都缓存一把
  
   缓存不要滥用





  
  
  
  


缓存当然不能滥用,这也是为什么缓存设置很复杂,
但对于一些建议的配制通常还是很有效的
虽然不是很恰当,我还是拿手gc作比方,最好只是配制,不要渗透到代码.
当然,针对性地缓存也是解决之道,如提供自己的clusterlisteners之类,但还是不要渗透到具体的应用层代码中.
0 请登录后投票
   发表时间:2007-03-30  
downpour 写道
的确是这样,所以在这种情况下,一般会选择一个另外一个不同的缓存策略,比如OSCache。

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

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

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

看了刚才大家的回答,我觉得页面缓存可能是个更好的解决方式,需要试一下.
0 请登录后投票
   发表时间: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进行敏捷开发>第一版来学习一下.
0 请登录后投票
   发表时间:2007-03-30  
性能的瓶颈找出来了
对于耗时耗资源的操作做个缓存,效果肯定很明显
 
   model = xx.getModel();
   如果获取model的过程很耗时耗资源,对这个结果集缓存即可
   至于缓存框架,有很多第三方的开源软件
   也可以自己整,一个简单实用的缓存框架核心代码200行左右
  


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

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

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

刚才和boss谈过,他认为做页面缓存也可以,但是现在不必要,要做别的事!呵呵,此问题暂告一段落.
0 请登录后投票
   发表时间:2007-03-30  
MVC ,缓存model即可

 
0 请登录后投票
   发表时间:2007-03-30  
其实可以把部分内容静态化,然后include
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics