hibernate一直的疑问 hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 但如果机群的话a机写得缓存在a机的内存b机写得缓存在b机的内存两个都更新各自的内存不会出现脏数据吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此回复为自动发出,仅用于显示而已,并无任何其他特殊作用楼主【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 % 值得尊敬 当数据有更新时Hibernate会立即更新数据库.并刷新缓存.并且缓存有缓存过时机制.过一段时间就清除缓存.不会存在数据不一致的情况. 没拿 hibernate 玩过数据库集群.而且不知道它支持不支持数据库集群.既然都玩集群了.为什么不直接用EJB呢?如果你说的是服务器集群的话,hibernate 缓存有生命周期的.问题不大. 当数据有更新时Hibernate会立即更新数据库.并刷新缓存.并且缓存有缓存过时机制.过一段时间就清除缓存.不会存在数据不一致的情况. 当数据有更新时Hibernate会立即更新数据库.并刷新缓存.并且缓存有缓存过时机制.过一段时间就清除缓存.不会存在数据不一致的情况. 当数据有更新时Hibernate会立即更新数据库.并刷新缓存.并且缓存有缓存过时机制.过一段时间就清除缓存.不会存在数据不一致的情况.!可是如果是集群环境的话!a机更新了数据库!那a机只是更新a机的缓存吧?可是集群中的b机缓存还是以前的阿? 我觉得这样的话。。要弄的东西多了,比如要把2个机器的缓存同步,开销大了,你为什么不用EJB呢 我用hibernate取数据的时候每次都会查数据库,如果像楼主说的那样应该设置hibernate的缓存机制,设置后会像楼主说的那样了 这样的话我有个问题了,是不是hibernate处理数据的时候是在数据库中数据更新的时候就检查各个调用缓存是不是最新的数据,然后如果不是那么重新加载,负责就不处理??? 这个要看你是用hibernate的悲观锁还是乐观锁吧 这跟cache也没任何关系啊 这跟悲观锁\乐观锁也没关系啊!如果hibernate把数据从数据库读取后对,对象持久化,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错的话!这跟悲观锁\乐观锁也没关系啊! 不是没人知道吧?hibernate 大家都不用他的集群吗? 我很纳闷这里哪来的脏数据呢?比如你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不会造成脏数据,关键是认为的逻辑错误使然. 你配置的是二级缓存吗?一级缓存是基于session的,session结束了,缓存就没了,不会出现脏数据的问题二级缓存的话可能会有冲突 Hibernate本身是对JDBC的轻量级封装,他无所谓集群不集群,和集群没有直接的关系,就好像你说JDBC支持不支持集群一样。不过Hibernate可以被用于集群环境中,只不过在集群环境中,有些东西是不能用的,像read-write cache。我复制的robbin的..参考:http://www.javaeye.com/topic/341 跟80x86cpu的cache相似楼主谈得是更新策略,一般来讲是用写回法,但貌似不太可能保证两台机器同步不过如果按照2楼使用全写法,那有没有cache也无所谓了所以两台机器的话,要在底层分布负载的软件上面解决不知道对不对... 我来学习了 呵呵大家好啊 我的网站http://www.ourjavasky.cn我的论坛http://www.ourjavasky.cn/bbs 这个是正解。在集群环境下,如果要启用二级缓存,就必需使用支持集群的缓存机制,比如 OSCache。 没明白!hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化.用户B访问B机,创建了一个session.并对tableA做更新操作.用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗? 那如果A.User更新了数据或者删除了数据.则B用户由于是从自己持久化的User对象里获取的数据所以.还能看到那条删除了的数据!这不算脏数据吗? 当数据有更新时Hibernate会立即更新数据库.并刷新缓存.并且缓存有缓存过时机制.过一段时间就清除缓存.不会存在数据不一致的情况 没明白! hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化. 用户B访问B机,创建了一个session.并对tableA做更新操作. 用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗? 没明白! hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化. 用户B访问B机,创建了一个session.并对tableA做更新操作. 用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗? 我仔细想了想,感觉还真是会出现脏数据的.试试如下途径进行集群 : 1. 不使用hibernate cache2. 好像有jdbc驱动的封装, 用于实现集群, 好像叫做c-jdbc, 配置hibernate使用这个jdbc 我很可怜,老是做不出了啊 集合框架API文档方法如何使用 java中button键如何设置为默认 想学编程,不知学什么好,敬请大侠们指教! 如何嵌入一个web browser 求各位赐一段简单的程序 麻烦各位给我一个JB8的试用版激活文件的地址(直接连接到文件) 谢谢!!! 我想学关于WEB开发方面,想请问一下应该学java的哪方面>??????? a little problem about the command "java" 简单问题简单问题简单问题简单问题 Java侦听系统终止事件,做好扫尾工作 请假一下runtime.exec调用exp命令导出oracle数据库的问题
楼主【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 %
值得尊敬
!可是如果是集群环境的话!a机更新了数据库!那a机只是更新a机的缓存吧?可是集群中的b机缓存还是以前的阿?
这跟cache也没任何关系啊
如果hibernate
把数据从数据库读取后对,对象持久化,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错的话!这跟悲观锁\乐观锁也没关系啊!
hibernate 大家都不用他的集群吗?
比如你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不会造成脏数据,关键是认为的逻辑错误使然.
http://www.ourjavasky.cn我的论坛
http://www.ourjavasky.cn/bbs
hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化.
用户B访问B机,创建了一个session.并对tableA做更新操作.
用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗?
删除了的数据!这不算脏数据吗?
hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化.
用户B访问B机,创建了一个session.并对tableA做更新操作.
用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗?
hibernate中,当一个对象持久化将数据库读取后,并将数据保存进缓存中,当第二次读取数据时,它就直接去缓存中取数据了,这点没错吧 用户A访问A机,创建了一个session.检索tableA并对检索结果,持久化.
用户B访问B机,创建了一个session.并对tableA做更新操作.
用户A再次访问持久话的tableA.如果他从缓存中读取tableA的话.不是无法看到.用户B对tableA做的操作了吗?
试试如下途径进行集群 : 1. 不使用hibernate cache
2. 好像有jdbc驱动的封装, 用于实现集群, 好像叫做c-jdbc, 配置hibernate使用这个jdbc