论坛首页 Java企业应用论坛

大家说说关于hibernate的二级缓存跟查询缓存

浏览 8354 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-11-29  
cectsky 写道
cnblsp2 写道
cectsky 写道
To be honest, 很久以前用过hibernate,没用过secondary cache


1.首先对于你这种场景,放在二级cache中是不明智的(放在二级cache中是那些经常查询,很少修改,能够保证在同级别下的更新的数据)
2.可以在每次修改子实体的时候,进行对根实体通知,进行cache同步操作。此时就涉及一个read-write的同步机制,EHCache已经支持。这可能会造成一些性能损耗,当然你的web app并发2000,还算能接受吧。
3.可以对修改子实体的方法注入操作,也就是AOP,简便并且松耦合

to cectsky

HI,您好, 其实现在的问题是,我最想实现的是hibernate二级缓存的可拔插

1. 是的,二级缓存的数据很少修改,目前我放到二级缓存的数据也是很少修改的,但这限于上线后运行一段时间,客户数据完善后。
2、3. 因为如果要手动更新,即使是用aop,但也要有这些同步的代码,而且如果有多对parent-child的话,那么就要有多个这样的代码,想问下大家做项目的时候也需要做这样的事情吗?


cectsky,你现在主要是做哪方面的项目,不知道是否方便介绍下你们的设计呢?谢谢~



目前做网管系统,用不到hibernate, 有好多知识都忘记了。

如果这个hibernate或EHCache没有内置的API解决,加code是不可避免了




呵呵,几个月前我也是做网管系统的,的确不适合hibernate,非常感谢~

0 请登录后投票
   发表时间:2012-11-29  
cnblsp2 写道
魔力猫咪 写道
很明显,你们代码操作的思想还是对表而不是对对象。
items是Group的属性。你删除item,应该操作group而不是单独去操作item。

您好,非常感谢您的回复:
  的确我之前开发的时候,都是根据表的,应该说,以前的Hibernate的使用也是简单使用,真正面向对象地去使用很少,不过按照您的说法的话,是不是操作item的时候都要通过group去操作呢?

如果有三层或者多层,如:
GroupParent(Set<Group>),
Group(Set<Items>)
Item

那么删除item的时候,难道要先拿到parent.groups.get(x).items.remove(item)
吗?


呵呵,按照我对面向对象的理解,操作item的话,那应该是出现在item相应的模块中吧?

不对之处,还望指正,谢谢~

我还发现一个问题。你在Set上面另建了一个缓存。等于items和item用的是两个缓存了。这个很可能是你脏数据的直接原因。
面向对象设计中,很多类之间是有关联的。比如最常见的订单包含很多订单明细。每个订单明细又引用了商品。我们应该如何操作呢。很明细,订单和商品是可以单独存在的,而订单明细是不能单独存在的,是订单的附属。那么我们可以得出应该有专门的订单操作和商品操作。而订单明细的操作应该归于订单操作中。
从数据库角度看,就是实体表,独立操作。连接表应该被归属于实体表的附属。
0 请登录后投票
   发表时间:2012-11-30  
魔力猫咪 写道
cnblsp2 写道
魔力猫咪 写道
很明显,你们代码操作的思想还是对表而不是对对象。
items是Group的属性。你删除item,应该操作group而不是单独去操作item。

您好,非常感谢您的回复:
  的确我之前开发的时候,都是根据表的,应该说,以前的Hibernate的使用也是简单使用,真正面向对象地去使用很少,不过按照您的说法的话,是不是操作item的时候都要通过group去操作呢?

如果有三层或者多层,如:
GroupParent(Set<Group>),
Group(Set<Items>)
Item

那么删除item的时候,难道要先拿到parent.groups.get(x).items.remove(item)
吗?


呵呵,按照我对面向对象的理解,操作item的话,那应该是出现在item相应的模块中吧?

不对之处,还望指正,谢谢~

我还发现一个问题。你在Set上面另建了一个缓存。等于items和item用的是两个缓存了。这个很可能是你脏数据的直接原因。
面向对象设计中,很多类之间是有关联的。比如最常见的订单包含很多订单明细。每个订单明细又引用了商品。我们应该如何操作呢。很明细,订单和商品是可以单独存在的,而订单明细是不能单独存在的,是订单的附属。那么我们可以得出应该有专门的订单操作和商品操作。而订单明细的操作应该归于订单操作中。
从数据库角度看,就是实体表,独立操作。连接表应该被归属于实体表的附属。

你好:
  你的意思是,Parent.items中的items不单独指定二级缓存吗?或者是指向items的二级缓存吗?
  但是据我的测试,即使是这样,按以下步骤:
1. 加载parent与parent.items
2. 单独删除该parent下的某item(不通过parent.items.remove(item))
3. 再次加载parent.items。出现根据ID到数据库找不到的异常。

也就是说,parent.items还是会保存着至少是旧items的主键列表~而这时候如果没有通知删除的话,那么程序就会抛出异常。

不知道大家用的时候是怎么用的,也是没有指定集合指向单独的缓存区域吗?
Hibernate有没有通知机制?还是真的要每一次手动通知呢?

谢谢~
0 请登录后投票
   发表时间:2012-11-30  
如果我没有记错的话 hibernate的缓存失效机制是这样的

想你这样的结果 类目和资源是一个多的关系,删除资源,不影响类目的缓存,然后你通过类目category的资源set获取资源 肯定还是以前的。

原理大概是这样的 例如类目的查询缓存,会有一个缓存放入的时间qTime,然后更新类目会有更新一个全局的关于该表更新的时间tableTime,假设取出缓存的时候,比较一下这两个时间发现tableTime>qTime 那就说明在这个阶段内表有更新会让缓存失效。这也就说明了为什么hibernate为什么要独占写才能保证cache的有效性。
而你删除了资源,再从类目中获取资源,肯定会有脏数据的
0 请登录后投票
   发表时间:2013-01-15  
二级缓存一般存放的都是很少修改的数据的。 
如果修改这里的数据, 你没有重新加载缓存吗?
0 请登录后投票
论坛首页 Java企业应用版

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