锁定老帖子 主题:Hibernate的优化:Cache
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-02
aimer311 写道 我想是的,你没有将表述的关键点比较明显的表述出来。我理解没错的话,你的观点是:
hibernate的执行过程是这样: 打开连接,取得id,到cache去找,若找到,则取cache,没有找到,执行查询,关闭连接。 而你修改后的执行过程是这样: 打开连接,打开事务,取得id,关闭连接,到cache去找,若找到,则取cache,没有找到,执行查询。 你没有强调问题所在,所以我们(至少包括xuzhfa123 )看得云里雾里 理解没错吧,因为我理解也这样,但是第二句(打开连接,打开事物,取得ID,关闭连接,查找CACHE,如果找到,则取CACHE,执行查询,******连接都关掉了,还查什么了,要再次创建了) |
|
返回顶楼 | |
发表时间: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连接数的问题 什么问题能说详细点吗? |
|
返回顶楼 | |
发表时间: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做什么? |
|
返回顶楼 | |
发表时间:2010-08-02
最后修改:2010-08-02
aimer311 写道 我想是的,你没有将表述的关键点比较明显的表述出来。我理解没错的话,你的观点是:
hibernate的执行过程是这样: 打开连接,取得id,到cache去找,若找到,则取cache,没有找到,执行查询,关闭连接。 而你修改后的执行过程是这样: 打开连接,打开事务,取得id,关闭连接,到cache去找,若找到,则取cache,没有找到,执行查询。 你没有强调问题所在,所以我们(至少包括xuzhfa123 )看得云里雾里 问题所在我已经用黑色字体标识出来了。hibernate需要保持着数据库连接去cache中查找数据。前面已经有很多同学看明白了。 |
|
返回顶楼 | |
发表时间: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,就不知道了,还没时间来了解。等了解了,咱们在讨论吧 |
|
返回顶楼 | |
发表时间:2010-08-02
楼主有测试数据吗
采用新方法之后性能上提高了多少? |
|
返回顶楼 | |
发表时间:2010-08-02
呵呵,新手帖
|
|
返回顶楼 | |
发表时间:2010-12-15
最新要学习hibernate cache,看到这个不错!
|
|
返回顶楼 | |