精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-12-01
环境: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会靠不住呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-12-01
hibernate有二次缓存的,就是所有session共享的缓存。你读出的数据可能是缓存里的。如果所有数据库访问都是通一个同一个sessionFactory的话,这个问题就会避免了。可是你直接用jdbc就等于绕过了hibernate的session,所以缓存里读出了脏信息。
|
|
返回顶楼 | |
发表时间:2007-12-03
补充一下,本人也考虑过这方面的问题:flush(),clear()了试过,一概无效,真不知道是不是应该高兴,也试过用HQL查询,也试过get(class,pk)
|
|
返回顶楼 | |
发表时间:2007-12-03
这是一个很基本的问题。你的flush(),clear()都只清空了一级缓存,二级缓存并没有被清空。
两种解决方案:1. 在查询你这个表时,避免把对象放入二级缓存(query.setCacheMode(CacheMode.IGNORE)).事实上你这么多的数据也是不应该放入二级缓存的。 2.清空二级缓存中此表对应的Pojo类。sessionFactory.evict(你的class类名)。 如何清空二级缓存所有的内容?楼下高手补充。也许清空所有二级缓存不是hibernate推荐的方式。 |
|
返回顶楼 | |
发表时间:2007-12-03
1肯定是缓存问题
至于2 我几乎从不用自动生成的东西 建议查一些连接或者资源占用的 看看是否有什么东西没有放开 |
|
返回顶楼 | |
发表时间:2007-12-03
为什么2天就当掉?我好像没遇到过
|
|
返回顶楼 | |
发表时间:2007-12-04
感谢blackteal
关于问题二,查了一下英文的网站,发现还真多,英文并不是太好,所以只看了关键的部分,就是说,避免用单态模式创建session |
|
返回顶楼 | |
发表时间:2007-12-04
用jdbc删除的话,hibernate的缓存不能同步了,
|
|
返回顶楼 | |
发表时间:2007-12-04
rohuddu 写道 用jdbc删除的话,hibernate的缓存不能同步了,
别出心裁 |
|
返回顶楼 | |
发表时间:2007-12-20
肯定是Hibernate 二级缓存的问题.
你用jdbc来删除数据的时候..相对hibernate的二级缓存是透明.. 所以你必须得重新清空一下hibernate的二级缓存. 然后在重新查询. 这样就查不出数据来啦.. session.clear()清空缓存中所有持久化对象 对于二级缓存来说,在 SessionFactory 中定义了许多方法, 清除缓存中实例、整个类、集合实例或者整个集合。 sessionFactory.evict(Class clz); |
|
返回顶楼 | |