论坛首页 Java企业应用论坛

用Spring Cache 实现Hibernate的二级缓存机制

浏览 16307 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-05-21  
cowboy_bebop 写道

如果有个list(9,8,7,6,5)  当我新添加一条记录10, 这个时候如果同样的查询条件查出的应该是list(10,9,8,7,6)[类似于分页倒序记录的添加]

而此时RelationShop缓存中还没有 对应于list(10,9,8,7,6) 的关系.

这个时候怎么通知list(9,8,7,6,5)更新呢?

 


这个是没有很有效的实时更新的办法,要看你的数据的敏感度.因为你增加的对象不在以前的List中, 所以新增的话是无法用比较细的粒度去更新的。解决办法:
1.当有某个Entity save, 把对应的List cache 全部清除。
2. 设置超时时间,等待List cache超时再读取一次,这样的影响是新增的数据需要过一段时间才能看到,但是不会读取脏数据。

0 请登录后投票
   发表时间:2012-05-21  
zybing 写道
就如楼上所提到的, 根据某种条件查出来的list, 再查一次结果就会不一样了.

在hibernate中,主要是保存查询出来的object, 查出来的list,会根据list获取对象,有了缓存就从缓存中获取数据, 就节省获取对象的时间.

对于list的缓存, hibernate会记录一下查询用到的依赖表,一旦依赖表发生变动,无论是否影响到这个list的结果, 一律删除(hibernate也无法知道是否会影响查询结果)

对于自己做的缓存, 除非对数据的精确度要求不高, 不建议对list也做缓存;


1. 只要ID一样,在缓存拿到的结果就是一样的
2. 我们也实现了类似hibernate的功能,想hibernate那样的cache为啥讨论的人少呢,其实用起来也不是很好,因为需要多次跟cache交互。
3. 不用不知道你有什么好的建议?静态页面的更新貌似更不可行.
0 请登录后投票
   发表时间:2012-05-22  
onecan 写道
zybing 写道
就如楼上所提到的, 根据某种条件查出来的list, 再查一次结果就会不一样了.

在hibernate中,主要是保存查询出来的object, 查出来的list,会根据list获取对象,有了缓存就从缓存中获取数据, 就节省获取对象的时间.

对于list的缓存, hibernate会记录一下查询用到的依赖表,一旦依赖表发生变动,无论是否影响到这个list的结果, 一律删除(hibernate也无法知道是否会影响查询结果)

对于自己做的缓存, 除非对数据的精确度要求不高, 不建议对list也做缓存;


1. 只要ID一样,在缓存拿到的结果就是一样的
2. 我们也实现了类似hibernate的功能,想hibernate那样的cache为啥讨论的人少呢,其实用起来也不是很好,因为需要多次跟cache交互。
3. 不用不知道你有什么好的建议?静态页面的更新貌似更不可行.


如果是网站提供固定的几种搜索,也可以采用静态页面的方式提供给用户浏览结果.

如果更新数据,可以把相关的静态页面全部重新再生成一次,这样大大降低了对数据库的使用,
0 请登录后投票
   发表时间:2012-05-23  
jinnianshilongnian 写道
1、Entity更新时从RelationShop找到对应的List并更新
  这个不需要吧 因为你的List存的只是ID啊



2、RelationShop cache 以Entity ID 作为key, 记录引用到这个Entity的List的所在的cache名称和key,用于当Entity更新时找到他所影响的List一起做更新操作
    建议上一个时间戳缓存,类似于Hibernate,我觉得要比RelationShop好。

3、当Entity Create Delete时应该直接删除List/修改时间戳吧?

4、你们现在 List如何保存呢? 如何得到Entity类型? 如果List为空呢?

几点疑问和见解


更新的时候 对于结果集类型的查询,如 List,Page类的,该类型缓存应该要失效才对,
删除时同理。
0 请登录后投票
论坛首页 Java企业应用版

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