Hibernate不能实时获取MySQL中更新


Hibernate禁止了一级、二级、查询缓存还是不能实时获取直接在MySQL中更新的记录的原因。

最近项目中用到了Hibernate,由于mysql数据库中的数据除了我的webservice应用会修改,还有另外一方的后台管理程序会修改,所有每次查询就需要实时的从mysql数据库中获取最新的数据。可是原以为是个很简单的事情,把二级和查询缓存都禁掉,每次sessionFactory.openSession()后用完就close掉(相当于也没有一级缓存)。可是当我应用程序中的hibernate第一次读取数据后,再直接在mysql控制台中修改那些记录中的数据,然后再次用hibernate执行同样的查询,虽然确确实实发出了sql查询语句,可是查询回来的数据还是更新之前的数据,断点调试也找不出原因。

最后再网上找到原因说是

Hibernate使用它自己默认的连接池,而它默认的连接池是很有问题的(具体什么问题不清楚!),使用c3p0连接池就正常了,在hibernate.cfg.xml配置文件里增加:

<property

name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider>

</property>
<property name="c3p0.min_size">5 </property> <!--在连接池中可用数据库连接的最小数目-->
<property name="c3p0.max_size">30 </property> <!--在连接池中所有数据库连接的最大数目-->
<property name="c3p0.time_out">1800 </property> <!--设定数据库连接的超时时间-->
<property name="c3p0.max_statement">50 </property> <!--可以被缓存的PreparedStatement的最大数目-->

需要下载 c3p0-0.9.1.jar  包,然后从hibernate源码中的hibernate.cfg.xml把关于c3p0连接池使用的相关的属性去掉并做相应的修改即可。

Hibernate整体理解

Hibernate工作机制及其常用类和方法

Hibernate 的详细介绍:请点这里
Hibernate 的下载地址:请点这里

本文永久更新链接地址:

相关内容