论坛首页 Java企业应用论坛

hibernate一直的疑问

浏览 15061 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-17  
加锁。。。
0 请登录后投票
   发表时间:2008-10-17  
寄生虫 写道
加锁。。。


离线锁不是加在数据库上的,我想你说的是数据库锁吧,不能用于楼主说的场景的,那会造成长时间的锁表,根本无法接受的。
0 请登录后投票
   发表时间:2008-10-17  
你完全没搞懂什么是缓存,什么是session。听你的意思,这不是hibernate的问题,似乎所有的系统都有这个问题了。你上论坛开了页面,发现有10条回复信息。这个时候管理员删除了5条,可是你的页面上还是10条,难道说这就是问题了吗?
0 请登录后投票
   发表时间:2008-10-18  
it.go 写道
你完全没搞懂什么是缓存,什么是session。听你的意思,这不是hibernate的问题,似乎所有的系统都有这个问题了。你上论坛开了页面,发现有10条回复信息。这个时候管理员删除了5条,可是你的页面上还是10条,难道说这就是问题了吗?


是的,他就是这个意思,要解释清楚这个东西和hibernate缓存甚至于和hibernate无关蛮复杂的,所以我建议他先去看一下离线乐观锁和离线悲观锁应用场景,他应该就明白了,或者问问题更有针对性了。
0 请登录后投票
   发表时间:2008-10-19  
呵呵。。你这是没搞明白session与一级缓存之间的关系。。一级缓存是随session的存在而存在的,你在做Hibernate的时候是保证一个事物一个session的。。当你对数据库操作完后你的事物是要提交的。。随着事物的提交你当前的session也是要关闭的。。session的生命周期一结束,缓存也是随着清空了的。。如果你要是硬要在事物未提交前进行检索的话。。那样造成数据的不一致是暂时的。。究竟session是有周期的。。如果你对数据的一致性要求特别高的话可以采用加锁来实现,具体加什么锁那就要看你的业务需求了!
0 请登录后投票
   发表时间:2008-10-19  
LZ说的A B机应该是指2台服务器吧。
0 请登录后投票
   发表时间:2008-10-19  
neora 写道
LZ说的A B机应该是指2台服务器吧。


单台一样的。我再说的更清楚点吧。

两个管理员同时登录,并且在一秒之内先后打开了同一个订单的修改页面。

第一个管理员修改了该订单的送货地址(北京改成上海),并保存。

然后第二个管理员修改了该订单的收货人电话,并保存。

这里只考虑一般的实现方式,所谓一般方式就是每次修改信息的时候都是把可修改的信息全部提交到服务端。

如果没有特殊机制的话,第二个管理员提交的信息会把第一个管理员的信息给覆盖,送货地址又变回北京了。


再或者想像一下,两个人同时用SVN提交同一段代码的修改,但是一定有先后,后提交的起了冲突,类似。
SVN的冲突其实就是“离线乐观锁”的一种具体表现形式。
9 请登录后投票
   发表时间:2008-10-19  
nlvivian 写道
hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧

用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化.
用户B访问B机,创建了一个session.并对tableA做更新操作.
用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗?



Session之上还有个SessionFactory。缓存是在SessionFactory这一级维护的。当B做了持久化操作,则相应的缓存就失效了。下次A从另外一个Session去访问的时候,已经不肯能从缓存中得到相同的对象或者得到的是更新过的对象(切切地说,根据缓存策略的不同会不同,记得Hibernate的属性中好像有一个是缓存策略是发生了持久化操作则更新缓存中的对象)。

乐观锁是指读取和更新不是在一个Session里面发生,这个时候为了保证2个不同时期的Session之间没有另外一个第三者Session插足进行持久化锁采用的版本策略,类似于一次性封条。

至于说A和B是个服务器,那缓存策略就需要采取支持群集的缓存了。MemCached或是JBoss的TreeCache或许是解决的办法,不过,没研究过,没有发言权。
0 请登录后投票
   发表时间:2008-10-21  
在要求数据很精确的情况下 一般不支持使用缓存机制!
0 请登录后投票
   发表时间:2008-10-22  
it.go 写道
你完全没搞懂什么是缓存,什么是session。听你的意思,这不是hibernate的问题,似乎所有的系统都有这个问题了。你上论坛开了页面,发现有10条回复信息。这个时候管理员删除了5条,可是你的页面上还是10条,难道说这就是问题了吗?



我确实不太明白,hibernate的缓存和session!可你就能讲明白吗?
0 请登录后投票
论坛首页 Java企业应用版

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