论坛首页 入门技术论坛

Hibernate的优化:Cache

浏览 14206 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-08-02  
aimer311 写道
我想是的,你没有将表述的关键点比较明显的表述出来。我理解没错的话,你的观点是:
hibernate的执行过程是这样:
打开连接,取得id,到cache去找,若找到,则取cache,没有找到,执行查询,关闭连接。
而你修改后的执行过程是这样:
打开连接,打开事务,取得id,关闭连接,到cache去找,若找到,则取cache,没有找到,执行查询。
你没有强调问题所在,所以我们(至少包括xuzhfa123 )看得云里雾里


理解没错吧,因为我理解也这样,但是第二句(打开连接,打开事物,取得ID,关闭连接,查找CACHE,如果找到,则取CACHE,执行查询,******连接都关掉了,还查什么了,要再次创建了)
0 请登录后投票
   发表时间:2010-08-02  
my_corner 写道
xly_971223 写道
问题虽然解决了 但是方法不是特别优雅
还不然直接抛弃hibernate 二级缓存自己封装一套更痛快

===========================================

另外如果采用opensessioninview的话,一个请求只打开一个jdbc connction
把连接池开大点 比如1000 也没啥关系
你的并发应该也大不过1000吧

呵呵,难道一个系统中只有这一个请求吗?如果只是一个查询就消耗那么多数据库连接,那还有update,insert等等操作呢。另外,opensessioninview的前提是 lazy 加载,lazy 会出现另外一个问题cache连接数的问题,改天会写篇博文描述一下。


opensessioninview的前提是 lazy 加载
这话不知道你从哪儿看到的,不用lazy加载就不能用opensessioninview吗?

lazy 会出现另外一个问题cache连接数的问题
什么问题能说详细点吗?
0 请登录后投票
   发表时间:2010-08-02  
xly_971223 写道
my_corner 写道
xly_971223 写道
问题虽然解决了 但是方法不是特别优雅
还不然直接抛弃hibernate 二级缓存自己封装一套更痛快

===========================================

另外如果采用opensessioninview的话,一个请求只打开一个jdbc connction
把连接池开大点 比如1000 也没啥关系
你的并发应该也大不过1000吧

呵呵,难道一个系统中只有这一个请求吗?如果只是一个查询就消耗那么多数据库连接,那还有update,insert等等操作呢。另外,opensessioninview的前提是 lazy 加载,lazy 会出现另外一个问题cache连接数的问题,改天会写篇博文描述一下。


opensessioninview的前提是 lazy 加载
这话不知道你从哪儿看到的,不用lazy加载就不能用opensessioninview吗?

lazy 会出现另外一个问题cache连接数的问题
什么问题能说详细点吗?

由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个 LazyLoad的Exception。所以为了解决这个问题,Spring引入了OpenSessionInViewFilter这个Filter,使得Hibernate的Session的生命周期变长。
你不用lazy,用OpenSessionInViewFilter做什么?
0 请登录后投票
   发表时间:2010-08-02   最后修改:2010-08-02
aimer311 写道
我想是的,你没有将表述的关键点比较明显的表述出来。我理解没错的话,你的观点是:
hibernate的执行过程是这样:
打开连接,取得id,到cache去找,若找到,则取cache,没有找到,执行查询,关闭连接。
而你修改后的执行过程是这样:
打开连接,打开事务,取得id,关闭连接,到cache去找,若找到,则取cache,没有找到,执行查询。
你没有强调问题所在,所以我们(至少包括xuzhfa123 )看得云里雾里

问题所在我已经用黑色字体标识出来了。hibernate需要保持着数据库连接去cache中查找数据。前面已经有很多同学看明白了。
0 请登录后投票
   发表时间:2010-08-02  
分离的北极熊 写道
aimer311 写道
我想是的,你没有将表述的关键点比较明显的表述出来。我理解没错的话,你的观点是:
hibernate的执行过程是这样:
打开连接,取得id,到cache去找,若找到,则取cache,没有找到,执行查询,关闭连接。
而你修改后的执行过程是这样:
打开连接,打开事务,取得id,关闭连接,到cache去找,若找到,则取cache,没有找到,执行查询。
你没有强调问题所在,所以我们(至少包括xuzhfa123 )看得云里雾里


理解没错吧,因为我理解也这样,但是第二句(打开连接,打开事物,取得ID,关闭连接,查找CACHE,如果找到,则取CACHE,执行查询,******连接都关掉了,还查什么了,要再次创建了)

回复"分离的北极熊":1、从数据库查id,从cache中拿到数据,如果cache中没有则从数据库中拿出,存入cache。你问道:一个是id是从数据库中查找ID,一个是从缓存中查找记录差距就有你想的那么大吗?这其中的时间会差多少?
这和数据库连接的时间没有关系,在一个并发高的系统中,数据库连接资源是有限的。你是想让连接保持长时间被占用不释放,还是想短时间用完 就释放?
2、memcache的缓存时间和程序没有任何关系,也不是jvm来控制的,是c写的。你说:memcache,就不知道了,还没时间来了解。等了解了,咱们在讨论吧
0 请登录后投票
   发表时间:2010-08-02  
楼主有测试数据吗
采用新方法之后性能上提高了多少?
0 请登录后投票
   发表时间:2010-08-02  
呵呵,新手帖
0 请登录后投票
   发表时间:2010-12-15  
最新要学习hibernate cache,看到这个不错!
0 请登录后投票
论坛首页 入门技术版

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