论坛首页 Java企业应用论坛

hibernate一直的疑问

浏览 15062 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-14  
daquan198163 写道
3.用户A再次访问持久话的tableA.从A机内存中读取tableA.
不对吧,如果不开二级缓存,用户A再次访问tableA应该能读到最新数据




先汗一个啊!
用户A 在A机 执行步骤
1.首先执行一个select tableA 获得持久化的tableA
2.用tableA的数据做一个耗时间的操作,得到结果C!
3.显示tableA的数据到表现层(此时应该还是用步骤1中持久化的tablea吧?)

如果用户B在B机.在用户A在A机做步骤2的同时!
删除了很多tableA的数据!

那用户A在A机的第三个步骤,就会显示出很多已经被用户B在B机已经删除的数据



另外想问一下如果没有集群的话:

用户A 在A机 执行步骤
1.首先执行一个select tableA 获得持久化的tableA
2.用tableA的数据做一个耗时间的操作,得到结果C!
3.显示tableA的数据到表现层(此时应该还是用步骤1中持久化的tablea吧?)


如果用户B也在A机,在用户A在做步骤2的同时!
删除了很多tableA的数据!并持久化了tableA

那用户A在A机的第三个步骤,使用的是自己在步骤1持久化的tableA.
还是使用的用户B持久化的tableA?









0 请登录后投票
   发表时间:2008-10-14  
daquan198163 写道
3.用户A再次访问持久话的tableA.从A机内存中读取tableA.
不对吧,如果不开二级缓存,用户A再次访问tableA应该能读到最新数据





daquan198163 写道
3.用户A再次访问持久话的tableA.从A机内存中读取tableA.
不对吧,如果不开二级缓存,用户A再次访问tableA应该能读到最新数据



用户A 在A机 执行步骤
1.首先执行一个select tableA 获得持久化的tableA
2.用tableA的数据做一个耗时间的操作,得到结果C!
3.显示tableA的数据到表现层(此时应该还是用步骤1中持久化的tablea吧?)

如果用户B在B机.在用户A在A机做步骤2的同时!
删除了很多tableA的数据!

那用户A在A机的第三个步骤,就会显示出很多已经被用户B在B机已经删除的数据



另外想问一下如果没有集群的话:

用户A 在A机 执行步骤
1.首先执行一个select tableA 获得持久化的tableA
2.用tableA的数据做一个耗时间的操作,得到结果C!
3.显示tableA的数据到表现层(此时应该还是用步骤1中持久化的tablea吧?)


如果用户B也在A机,在用户A在做步骤2的同时!
删除了很多tableA的数据!并持久化了tableA

那用户A在A机的第三个步骤,使用的是自己在步骤1持久化的tableA.
还是使用的用户B持久化的tableA?









0 请登录后投票
   发表时间:2008-10-14  
使用oschahe等支持集群的缓存机制来解决.
如果应用比较大,机器比较多,之间又不需要同步的话.
需要专门做一个集中式缓存来解决这些问题
0 请登录后投票
   发表时间:2008-10-14  
楼主应该买本hibernate实战看看。
这些问题不应该是由论坛给你解答的
0 请登录后投票
   发表时间:2008-10-15  
nlvivian 写道

先汗一个啊!
用户A 在A机 执行步骤
1.首先执行一个select tableA 获得持久化的tableA
2.用tableA的数据做一个耗时间的操作,得到结果C!
3.显示tableA的数据到表现层(此时应该还是用步骤1中持久化的tablea吧?)
如果用户B在B机.在用户A在A机做步骤2的同时!
删除了很多tableA的数据!
那用户A在A机的第三个步骤,就会显示出很多已经被用户B在B机已经删除的数据

照这么说,就算解决了并发问题,那么A的操作结束后数据返回客户端过程中B去删除了A表数据,A用户一样会看到很多已经被B删除的数据。
首先,这个问题无发避免,
其次,这个问题无关痛痒:只要A看到的数据是正确、一致的就可以,在客户端看到的任何数据当然都可能是过期的,只要保证用户不会因为使用过期数据造成别的错误
前面我也说了,离线乐观锁可以解决这个“用户不会因为使用过期数据造成别的错误”的问题
例如把version作为session变量或表单hidden字段
nlvivian 写道

另外想问一下如果没有集群的话:
用户A 在A机 执行步骤
1.首先执行一个select tableA 获得持久化的tableA
2.用tableA的数据做一个耗时间的操作,得到结果C!
3.显示tableA的数据到表现层(此时应该还是用步骤1中持久化的tablea吧?)
如果用户B也在A机,在用户A在做步骤2的同时!
删除了很多tableA的数据!并持久化了tableA
那用户A在A机的第三个步骤,使用的是自己在步骤1持久化的tableA.
还是使用的用户B持久化的tableA?

如果不用二级缓存,集不集群 行为都一样
0 请登录后投票
   发表时间:2008-10-15  
楼主的问题应该问的是一个基本问题:就是数据修改后,缓存中会不会是旧数据的问题。跟锁,集群没有什么关系。

楼主自己也说了,只是看过Hibernate文章,实践过1-2次而已。其实楼主应该怀着这个疑问,写个例子测试一下就知道了,例子不难写。

其实这是个很简单的问题,你想想 Hibernate 会不会这么弱,Cache打开时,无法发现 table A 被第二个用户做了更新操作?
当然不会,你可以用一个简单的逻辑考虑:Hibernate既然很强大,Gavin King他老人家不可能解决不了这个小 case。


至于原理, table A 被第 用户 B 修改后(其实跟B机器没有关系,在A机修改也一样,楼主说的 A,B机应该是浏览器吧? ), Cache 会更新 table A在 UpdateTimestampCache 中的时间戳, 并且,被修改的记录,例如 id = 78,会自动在 二级缓存区域中 修改它; 下次 A 用户再查询  table A 时, 仍从缓存中读取, 由于Cache中的 id=78记录已被修改,所以查询到的数据就是最新的了。 至于 删除, 新增类似的原理。


还是那句话: 实践一下,不要老想! 楼主应该怀着这个疑问,写个例子测试一下就知道了,例子不难写。
3 请登录后投票
   发表时间:2008-10-15  
to 楼上的:你说的是二级缓存,不在本讨论范围内
0 请登录后投票
   发表时间:2008-10-15  
一般还是使用乐观锁的!这样好些!
0 请登录后投票
   发表时间:2008-10-16  
哪你每次updata完session.close()就解决问题了
0 请登录后投票
   发表时间:2008-10-16  
daquan198163 写道
哦,这个意思啊
离线乐观锁可以解决


right,请楼主搜索“离线乐观锁”或“离线悲观锁”再来讨论,这和什么一级缓存二级缓存没有直接关系。

更多的是从业务上来考虑,尤其是“离线悲观锁”。
0 请登录后投票
论坛首页 Java企业应用版

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