hibernate 不能实时获取数据库中更新的记录问题解决

项目用到hibernate进行与mysql数据库的连接和操作,有一个“查询”模块和“添加”模块,是用不同的hibernate配置文件来做的。在做完添加后做查询时发现了问题,查询的结果总是添加之前的,而最新更新的记录却没有被查询得到。只有重启tomcat服务器才能查到更新的记录。

google之。

网上提到了hibernate的缓存机制,http://blog.csdn.net/fjun0910/article/details/6092829

按其中所说,查询前用session.clear();清除一级缓存,重新尝试添加+查询,还是查不到更新记录。用setCacheMode(CacheMode.IGNORE)清二级缓存,实验,失败。两个都进行清除,依然失败。

正迷茫时,找到了这里:http://blog.sina.com.cn/s/blog_6d818993010137in.html

虽然说得并不是很明白,但是找到了问题所在:hibernate默认连接池的问题,使用c3p0连接池就可以了。于是按此方法以下述步骤解决问题:

首先添加需要的jar包:hibernate-c3p0-4.2.0.final.jar,c3p0-0.9.2.1.jar,mchange-commons-java-0.2.7.jar,可以分布去http://mvnrepository.com/和 http://www.java2s.com/下载,注意mchange-commons-java的版本不要过低,否则会ClassNotFound错。

修改hibernate配置文件,用c3p0连接池连接数据库,在之前的配置以外加入如下配置:

	<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <!--  <property name="hibernate.c3p0.timeout">120</property>-->
        <property name="automaticTestTable">Test</property>
        <property name="hibernate.c3p0.max_statements">100</property>
        <property name="hibernate.c3p0.idle_test_period">120</property>
        <property name="hibernate.c3p0.acquire_increment">1</property>
        <property name="c3p0.testConnectionOnCheckout">true</property>
        <property name="c3p0.idleConnectionTestPeriod">18000</property>
        <property name="c3p0.maxIdleTime">25000</property>

解决问题。

以上。

时间: 2024-10-08 02:25:06

hibernate 不能实时获取数据库中更新的记录问题解决的相关文章

通过jdbc获取数据库中的表结构

通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.MetaData中通过一系列getXXX函数,将这些信息存放到ResultSet里面,然后返回给用户.关于MetaData的说明网上也有不少,这里我只是从我自身学习的角度来记录一下简单使用JDBC以及获取数据表相关信息的方法. DatabaseMetaData dbmd = con.getMetaData()

如何实时获取DBGrid 中当前单元格输入的内容?

如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理, 用什么事件呢? 所以Field的Onchange事件是没用的. 这个问题简单啊,每输入1个数据的后就提交(并不是提交到数据库,还是在编辑状态),那么用DataSet就可以取值了 用DBGrid的KeyUp事件: procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word;   Shift: TShiftState); beg

(很难啊)如何实时获取DBGrid 中当前单元格输入的内容? [问题点数:100分,结帖人yifawu100]

如何获取DBGrid 中当前单元格输入的内容? 还没输入完成,我想实时获取 Cell中的内容,以便作其他处理,用什么事件呢? 所以Field的Onchange事件是没用的. DBGrid1.SelectedField.AsStringDBGrid1.SelectedField.Text看你需要选择 这个问题简单啊,每输入1个数据的后就提交(并不是提交到数据库,还是在编辑状态),那么用DataSet就可以取值了用DBGrid的KeyUp事件: procedure TForm1.DBGrid1Key

zend framework获取数据库中枚举类enum的数据并将其转换成数组

在model中建立这样的模型,在其中写入获取枚举类的方法 class Student extends Zend_Db_Table{ protected $_name ='student'; protected $_primary ='id'; function getPartyEnum($enumname){ //适配器并获取数据 $db = $this->getAdapter(); $db->query("SET NAMES GBK"); $sql = $db->q

使用 UEditor 编辑器获取数据库中的数据

在 ThinkPHP 3.2.2 中,使用 UEditor 编辑器获取数据库中保存的数据,可以使用 UEditor 自身提供的方法. 首先在视图模板中实例化编辑器,这是出现编辑器界面的必须的行为: <script type="text/javascript"> var editor = UE.getEditor('container'); </script> 然后使用 setContent 方法来使数据显示在编辑框内: editor.setContent(dat

在数据库中更新虚拟机实例的任务状态为NULL

有时候一个实例一直卡死在一个任务状态上,不能再对此实例进行任何操作,这是需要在数据库中把这个虚拟机的任务状态改为NULL,修改方法如下: update instances set task_state=NULL whereuuid="5209f21b-b81e-4e19-8193-57263dc93dd7";        注:NULL值的两边是不用""括起来的. 在数据库中更新虚拟机实例的任务状态为NULL

Hibernate 查询结果与数据库中的数据不一致

hibernate的bug: https://hibernate.atlassian.net/browse/HHH-4956 解决办法: 添加别名select max(max_pre_nights) ,max(max_post_nights) from package_pre_post_hotel where package_id = :packageId添加别名后可以解决问题,如果SQL中的列名不是唯一的,最好都添加别名,比如 select a.id as a_id , b.id as b_i

JS中获取数据库中的值

在本次项目中,遇到很多问题,经过努力,都逐步得到解决.静下心来,做一个记录,以供以后学习. 在项目中遇到一个问题,需要在JS中读取数据库中的值,然后再把值返回到页面中,解决方案如下:使用Ajax方法来实现,需要用到ajax.dll(一个ajax技术开发的帮助类库). 实施过程如下: 1.引用Ajax.dll 2.在App_Code写具体的方法,最好单独建立一个类文件,然后写具体方法. public class AjaxMethod www.2cto.com { public AjaxMethod

获取数据库中用户表所有列和列的数据类型

获取数据库中,所有用户表中每一列名和其数据类型. SELECT OBJECT_NAME(c.OBJECT_ID) AS [Table_Name], c.[name] AS [Column_Name] ,t.[name] AS [Data_Type_Name] FROM sys.columns AS c LEFT JOIN SYSOBJECTS AS s ON (c.[object_id] = s.[id]) LEFT JOIN sys.types AS t ON (c.[user_type_id