`

偶在项目中用hibernate居然从能清空了的数据库里查询到数据?

阅读更多
本人在为公司的一个大客户做web ordering系统,其中遇到了一些hibernate的问题,蛮有意思的,虽然我已经用别的方法解决,但对存在的问题一直没有根本的理解,放在这里来,跟大家一起分享一下,能解决就解决,不能解决的就给别人当个提醒,绕开这个错误
环境:tomcat+mysql
问题一:
清空数据库后还能查询到数据
对一个数据库里的4个表,每个表有10000+条数据,直接用JDBC来一次性全部删除(爽啊),从数据库里查询也是已经清空了,连auto_increment也重置为0了,但奇怪的是,在接着的导入模块里,用hibernate的session.get(class,pkid)还是能查询到删除的数据,晕死了,4个表加起来是4W多条数据啊
偶的解决办法:用hibernate来清空数据,
疑惑:为什么用JDBC就是不行呢???
问题二:
hibernatefactory类,用myeclipse插件生成的这个类,是蛮方便的,hibernatefactory.getsession()就能获取session了,方便啊,但它似乎经不起时间的考验,系统跑了1,2天后,就再也不能正常连接到数据库里了
偶的解决办法:才才实实起自己new config,再从自己new 的config里getsession
疑惑:为什么hibernatefactory会靠不住呢?
分享到:
评论
15 楼 fire314159 2008-05-30  
dmewy 写道
是不是不用hibernate自带的连接池就没这个问题啊.



the connection pool is related to LZ's second question only.

If you take a look at the hibernate boot log, you can see a line indicate that the default connection pool of hibernate is not for production. try to use DHCP or C3P0 instead, it should solve the DB connection failure.


For the first question, I also think that is due to second level cache.
14 楼 dmewy 2008-05-30  
是不是不用hibernate自带的连接池就没这个问题啊.
13 楼 wangzhongjie 2008-05-30  
silence1214 写道
这个问题也搞过我很郁闷,如果你没有用缓存的话,而出现这个问题,其实就是你数据源的问题,hibernate自带的数据源有bug,你换个就好了

hibernate官方就不建议使用他自带的连接池实现^_^
12 楼 fire314159 2008-05-30  
reno_k 写道
感谢blackteal
关于问题二,查了一下英文的网站,发现还真多,英文并不是太好,所以只看了关键的部分,就是说,避免用单态模式创建session



my sessionFactory generated by myeclipse is working fine. I dont know why singleton is not good, could you please tell us more details? For your second question, I think it is due to session connection pool. the default connection pool in hibernate is not for production use. for an example, if you use hibernate to connect mysql, normally, after 8 hours of no activity, the connection will fail and can not be auto recovered. that is a problem we call "connection failure over night". please check your hibernate connection pool setting to see if that is the case.
11 楼 wang19841229 2008-05-30  
个人感觉还是缓存的问题,因为JDBC操作会绕过hibernate造成hibernate并不知道数据已经清空。所以才出现这个问题,但是我怀疑楼主是否开了二级缓存,如果打开了二级缓存这种问题是可能的,但是如果没有使用二级缓存,以上的推动就有问题了。因为二级缓存hibernate默认是不打开的
10 楼 silence1214 2008-05-27  
这个问题也搞过我很郁闷,如果你没有用缓存的话,而出现这个问题,其实就是你数据源的问题,hibernate自带的数据源有bug,你换个就好了
9 楼 wangxuliangboy 2007-12-20  
肯定是Hibernate 二级缓存的问题.

你用jdbc来删除数据的时候..相对hibernate的二级缓存是透明..

所以你必须得重新清空一下hibernate的二级缓存.

然后在重新查询.
这样就查不出数据来啦..
session.clear()清空缓存中所有持久化对象
对于二级缓存来说,在 SessionFactory 中定义了许多方法, 清除缓存中实例、整个类、集合实例或者整个集合。  sessionFactory.evict(Class clz);

8 楼 smh2008 2007-12-04  
rohuddu 写道
用jdbc删除的话,hibernate的缓存不能同步了,

别出心裁
7 楼 rohuddu 2007-12-04  
用jdbc删除的话,hibernate的缓存不能同步了,
6 楼 reno_k 2007-12-04  
感谢blackteal
关于问题二,查了一下英文的网站,发现还真多,英文并不是太好,所以只看了关键的部分,就是说,避免用单态模式创建session
5 楼 andrewdu 2007-12-03  
为什么2天就当掉?我好像没遇到过
4 楼 ddandyy 2007-12-03  
1肯定是缓存问题
至于2 我几乎从不用自动生成的东西  建议查一些连接或者资源占用的 看看是否有什么东西没有放开
3 楼 blackteal 2007-12-03  
这是一个很基本的问题。你的flush(),clear()都只清空了一级缓存,二级缓存并没有被清空。
两种解决方案:1. 在查询你这个表时,避免把对象放入二级缓存(query.setCacheMode(CacheMode.IGNORE)).事实上你这么多的数据也是不应该放入二级缓存的。
2.清空二级缓存中此表对应的Pojo类。sessionFactory.evict(你的class类名)。
如何清空二级缓存所有的内容?楼下高手补充。也许清空所有二级缓存不是hibernate推荐的方式。
2 楼 reno_k 2007-12-03  
补充一下,本人也考虑过这方面的问题:flush(),clear()了试过,一概无效,真不知道是不是应该高兴,也试过用HQL查询,也试过get(class,pk)
1 楼 Anatorian 2007-12-01  
hibernate有二次缓存的,就是所有session共享的缓存。你读出的数据可能是缓存里的。如果所有数据库访问都是通一个同一个sessionFactory的话,这个问题就会避免了。可是你直接用jdbc就等于绕过了hibernate的session,所以缓存里读出了脏信息。

相关推荐

Global site tag (gtag.js) - Google Analytics