`

偶在项目中用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,所以缓存里读出了脏信息。

相关推荐

    利用Struts2+Hibernate+maven进行分页查询

    总结一下,利用Struts2、Hibernate和Maven进行分页查询,需要配置好Maven的依赖,编写Struts2的Action和Interceptor,利用Hibernate的Criteria API处理数据库查询,最后在JSP页面上实现分页展示。这个过程涉及到项目...

    java学生管理系统-数据库小项目

    5. **数据库连接池**:在实际项目中,通常会使用数据库连接池(如C3P0、HikariCP或Apache DBCP)来管理数据库连接,以提高性能和资源利用率。 综上所述,这个项目涵盖了Java编程、数据库设计与操作、以及两者之间的...

    VB代码 从数据库快速导出数据到EXCEL

    ### VB代码实现从数据库快速导出数据到EXCEL的知识点详解 #### 一、核心概念与技术背景 在企业级应用开发中,数据处理与报表生成是常见的需求之一。使用VB(Visual Basic)进行编程,可以高效地实现从数据库提取...

    VC6.0 MFC 数据库读入数据显示在对话框.rar

    这个压缩包文件“VC6.0 MFC 数据库读入数据显示在对话框.rar”显然涉及到如何使用MFC来从数据库读取数据,并在对话框中显示这些数据。以下是对这个主题的详细讲解: 首先,我们需要理解MFC中的CDatabase和...

    excel表导入数据库 数据库导出excel(idea平台)

    1. 在Servlet中,根据用户请求,查询数据库中的数据,可能需要进行一些筛选或聚合操作。 2. 创建Excel工作簿和工作表对象,使用Apache POI将数据写入到工作表中。 3. 设置单元格格式,如对齐方式、字体、颜色等,以...

    在eclipse中使用hibernate

    ### 在Eclipse中使用Hibernate的知识点详解 #### 1. 持久化框架产生的背景和现状 在Java开发过程中,特别是在涉及数据库交互时,由于数据库本身的特性(通常是关系型数据库),与Java语言的面向对象特性之间存在...

    VB中用ADODC控件连接ACCESS数据库.doc

    VB中用ADODC控件连接ACCESS数据库 VB中用ADODC控件连接ACCESS数据库是VB开发中的一种常见的数据库连接方法。下面我们将详细介绍如何使用ADODC控件连接ACCESS数据库。 首先,我们需要建立一个ACCESS数据库,创建一...

    在VB中用DAO实现数据库编程.rar

    在VB(Visual Basic)中,DAO(Data Access Objects,数据访问对象)是Microsoft提供的一种用于与数据库进行交互的早期技术。DAO允许程序员通过编写代码来创建、查询、更新和删除数据库中的记录,它主要适用于Access...

    hibernate需要的10个jar

    在实际开发中,将这些JAR添加到项目的类路径(ClassPath)中,是确保Hibernate能正常工作的基础。同时,还需要正确配置Hibernate的配置文件(hibernate.cfg.xml),指定数据库连接参数、实体类位置、持久化策略等。...

    hibernate 连接数据库基础源码

    【hibernate 连接数据库基础源码】的解析与详解 Hibernate 是一款强大的对象关系映射(ORM)框架,它极大地简化了Java应用程序...在实际项目中,可以根据需求选择合适的数据库,利用Hibernate的强大功能提高开发效率。

    VB 绑定数据到DataGrid显示的数据库实例.rar

    这是一个在VB中使用 数据库绑定控件DataGrid的实例,演示了如何将从数据库中读取出的数据显示到DataGrid控件中。本例子中包括了很多ADO 操作数据库方面的基本操作,是新手学习VB环境下的ado操作的好范例,比如添加、...

    PHP实现在数据库百万条数据中随机获取20条记录的方法

    在去某个公司面试时,让写个算法出来,当时就蒙了,我开发过程中用到算法的吗?又不是大数据开发,分析。 今天偶然想起来一个坑爹数据,如:PHP取百万条数据中随机20条记录,当时就用的算法。 1.先统计统计数据库...

    myeclipse 中用 JSP连接数据库详细截图 + jsp查询类代码

    本文档详细介绍了如何使用 MyEclipse 中的 JSP 连接数据库,展示了从创建数据库连接到查询数据的整个过程。下面是本文档中所涉及的知识点: 一、MyEclipse 数据库连接 * 打开 MyEclipse 并创建一个新的数据库连接 ...

    C# winform、学习数据库SQlite,学会数据表创建、数据插入、数据删除等操作

    SQLite则是一个轻量级的、开源的关系型数据库,它不需要单独的服务器进程,可以直接嵌入到应用程序中,非常适合小型和移动应用的数据存储。 本文将详细介绍如何利用C# Winform与SQLite数据库进行交互,包括创建...

    Eclipse上使用Hibernate

    您需要将 hibernate3.jar 添加到项目中,同时也需要将 Hibernate 的 lib 文件夹下的所有文件添加到项目中,以免出现 ClassNotDef 的异常。 配置 Hibernate 在配置 Hibernate 之前,您需要在项目中添加 Oracle 的 ...

    SQL数据库设计和高级查询.doc

    SQL数据库设计和高级查询是数据库管理系统中的核心概念,它涵盖了从设计高效数据库结构到执行复杂的查询操作的全过程。良好的数据库设计对于数据管理至关重要,因为它直接影响到数据的存储效率、数据一致性和系统的...

    MFC从数据库提取数据代码

    首先,要从数据库中提取数据,我们需要连接到数据库。在 MFC 中,这通常通过 `CDatabase` 类实现。创建一个 `CDatabase` 对象,并传递适当的连接字符串,如 ODBC 数据源名 (DSN)、用户名、密码等。例如: ```cpp ...

    C#查询数据库里的信息

    在C#编程中,查询数据库是一项基础且重要的任务,尤其在开发桌面应用程序时,Access数据库经常作为小型数据存储解决方案被采用。本项目是关于如何利用C#语言与Microsoft Access数据库进行交互,实现对数据库内信息的...

    Hibernate Tool.zip

    6. **整合到项目**:最后,将生成的文件导入到项目中,根据实际需求进行适当的修改和调整,然后就可以在项目中使用这些实体类进行数据库操作了。 使用Hibernate Tool不仅能提高开发效率,还有助于保持代码的一致性...

    VB6实现多线程数据库大数据查询

    本例实现的是在主界面开一个新的线程在后台完成数据查询并根据提供的每页显示的数据行数计算出总页数,然后返回给主界面并显示在表格中。在等待查询的过程中,主界面会给用户简单的提示,提示用户后台正在处理数据。...

Global site tag (gtag.js) - Google Analytics