hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 
但如果机群的话
a机写得缓存在a机的内存
b机写得缓存在b机的内存
两个都更新各自的内存不会出现脏数据吗?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【nil2000】截止到2008-07-26 13:48:36的历史汇总数据(不包括此帖):
    发帖的总数量:67                       发帖的总分数:13736                    每贴平均分数:205                      
    回帖的总数量:68                       得分贴总数量:4                        回帖的得分率:5%                       
    结贴的总数量:66                       结贴的总分数:13617                    
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:1                        未结的总分数:119                      
    结贴的百分比:98.51 %               结分的百分比:99.13 %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    值得尊敬
      

  2.   

    当数据有更新时Hibernate会立即更新数据库.并刷新缓存.并且缓存有缓存过时机制.过一段时间就清除缓存.不会存在数据不一致的情况.
      

  3.   

    没拿 hibernate 玩过数据库集群.而且不知道它支持不支持数据库集群.既然都玩集群了.为什么不直接用EJB呢?如果你说的是服务器集群的话,hibernate 缓存有生命周期的.问题不大.
      

  4.   

    当数据有更新时Hibernate会立即更新数据库.并刷新缓存.并且缓存有缓存过时机制.过一段时间就清除缓存.不会存在数据不一致的情况.
      

  5.   

    当数据有更新时Hibernate会立即更新数据库.并刷新缓存.并且缓存有缓存过时机制.过一段时间就清除缓存.不会存在数据不一致的情况.
      

  6.   

    当数据有更新时Hibernate会立即更新数据库.并刷新缓存.并且缓存有缓存过时机制.过一段时间就清除缓存.不会存在数据不一致的情况.
    !可是如果是集群环境的话!a机更新了数据库!那a机只是更新a机的缓存吧?可是集群中的b机缓存还是以前的阿?
      

  7.   

    我觉得这样的话。。要弄的东西多了,比如要把2个机器的缓存同步,开销大了,你为什么不用EJB呢
      

  8.   

    我用hibernate取数据的时候每次都会查数据库,如果像楼主说的那样应该设置hibernate的缓存机制,设置后会像楼主说的那样了
      

  9.   

    这样的话我有个问题了,是不是hibernate处理数据的时候是在数据库中数据更新的时候就检查各个调用缓存是不是最新的数据,然后如果不是那么重新加载,负责就不处理???
      

  10.   

    这个要看你是用hibernate的悲观锁还是乐观锁吧
      

  11.   


    这跟cache也没任何关系啊
      

  12.   

    这跟悲观锁\乐观锁也没关系啊!
    如果hibernate
    把数据从数据库读取后对,对象持久化,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错的话!这跟悲观锁\乐观锁也没关系啊!
      

  13.   

    不是没人知道吧?
    hibernate 大家都不用他的集群吗?
      

  14.   

    我很纳闷这里哪来的脏数据呢?
    比如你A虚拟机中有个User对象(并且是持久化状态);B虚拟机中也有个相同的User对象(就是数据库中ID同A虚拟机相同的User对象)
    1.  A.User改变了然后B.User也改变了.自然最后在数据库中的是B.user的最后改变.
    2.  A.User删除了,B.User也执行删除操作.B.user只不过删除不到什么东西.也不会有什么问题.
    3.  如果你在A虚拟中增加了一个User对象,而在B虚拟机中也增加了一个User对象.就是加2个User呗也不会有什么脏数据啊.但是唯一要注意的是同步问题.比如有个保存树形结构的表每删除一条数据就要从新生成一遍treeCode.这时在执行玩delete后就要从新构建这棵新的树,
    这时就需要用到对象锁锁定,等从新构建完后再允许有其他的删除或是更新的操作.如下代码:
    private static final Object TREEBUILD_FLAG = new Object();
    public void rebuildWebDirTree(int id) {
    synchronized (TREEBUILD_FLAG) {
    _rebuildWebDirTree(id);
    }
    }

    private void _rebuildWebDirTree(int id){
    if(this.getWebDirChildrenCount(id)>0){
    int ordering = 1;
    for(WebDir dir : this.getWebDirList(id)){
    dir.setOrdering(ordering*10);
    String treeCode = ("000"+ordering).substring((""+ordering).length());
    if(dir.getPid()==0){
    dir.setTreeCode(treeCode);
    }else{
    WebDir dirP = this.getWebDir(dir.getPid());
    dir.setTreeCode(dirP.getTreeCode()+treeCode);
    }
    this.updateWebDir(dir);
    ordering ++;
    this.rebuildWebDirTree(dir.getId());
    }
    }
    }我举上面的例子就是想告诉你, 同步的问题是数据库层面的问题.与什么集群不集群的没啥关系.Hibernate不会造成脏数据,关键是认为的逻辑错误使然.
      

  15.   

    你配置的是二级缓存吗?一级缓存是基于session的,session结束了,缓存就没了,不会出现脏数据的问题二级缓存的话可能会有冲突
      

  16.   

    Hibernate本身是对JDBC的轻量级封装,他无所谓集群不集群,和集群没有直接的关系,就好像你说JDBC支持不支持集群一样。不过Hibernate可以被用于集群环境中,只不过在集群环境中,有些东西是不能用的,像read-write cache。我复制的robbin的..参考:http://www.javaeye.com/topic/341
      

  17.   

    跟80x86cpu的cache相似楼主谈得是更新策略,一般来讲是用写回法,但貌似不太可能保证两台机器同步不过如果按照2楼使用全写法,那有没有cache也无所谓了所以两台机器的话,要在底层分布负载的软件上面解决不知道对不对...
      

  18.   

    我来学习了  呵呵大家好啊 我的网站
    http://www.ourjavasky.cn我的论坛
    http://www.ourjavasky.cn/bbs
      

  19.   

    这个是正解。在集群环境下,如果要启用二级缓存,就必需使用支持集群的缓存机制,比如 OSCache。
      

  20.   

    没明白!
    hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化.
    用户B访问B机,创建了一个session.并对tableA做更新操作.
    用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗?
      

  21.   

    那如果A.User更新了数据或者删除了数据.则B用户由于是从自己持久化的User对象里获取的数据所以.还能看到那条
    删除了的数据!这不算脏数据吗?
      

  22.   

    当数据有更新时Hibernate会立即更新数据库.并刷新缓存.并且缓存有缓存过时机制.过一段时间就清除缓存.不会存在数据不一致的情况
      

  23.   

    没明白! 
    hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化. 
    用户B访问B机,创建了一个session.并对tableA做更新操作. 
    用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗? 
      

  24.   

    没明白! 
    hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化. 
    用户B访问B机,创建了一个session.并对tableA做更新操作. 
    用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗? 
      

  25.   

    我仔细想了想,感觉还真是会出现脏数据的.
    试试如下途径进行集群 : 1. 不使用hibernate cache
    2. 好像有jdbc驱动的封装, 用于实现集群, 好像叫做c-jdbc, 配置hibernate使用这个jdbc