Hibernate整合C三P0落实连接池

Hibernate不能实时获取MySQL数据库的更新

最近项目中使用到了Hibernate,但每次数据库记录有更新后,用hibernate无法查找到更新后的数据。网上查找了许多教程,最终发现通过更改hibernate的默认连接池可以解决。通过使用c3p0连接池,替换掉hibernate的默认连接池后,就可以查找到MySQL更新后的数据了。

具体修改方法如下:

在hibernate.cfg.xml配置文件中,增加以下内容:

 <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.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>

附上c3p0的jar包,下载地址:

最近项目中使用到了Hibernate,但每次数据库记录有更新后,用hibernate无法查找到更新后的数据。网上…

我们今天主要描述Hibernate用MySQL数据库时链接关闭异常的实际解决方案,愿在你学习Hibernate用MySQL数据库时链接关闭异常的实际解决方案中以起到抛砖引玉的作用,以下就是文章的详细内容介绍,望大家借鉴。

Hibernate中可以使用默认的连接池,无论功能与性能都不如C3PO(网友反映,我没有测试过),C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

在一个项目中,客户要求除操作系统外全部使用免费软件,因此我使用了MySQL
4.0作为MySQL数据库服务器,其JDBC驱动为3.0.9版本,在给客户安装后调试一切正常。可是到了第二天,只要一登录就提示“No
operations allowed after connection
closed”异常,显示在浏览器上。在经过一番检查后我发现,在这种情况下只要重新启动Tomcat就恢复正常,然而到了第二天问题依旧。

C3P0是一个易于使用JDBC3规范和JDBC2可选的扩展定义的功能增强,使传统的JDBC驱动程序“enterprise-ready”库。特别是C3P0提供了一些有用的服务:适应传统的基于DriverManager中的JDBC驱动程序的新的类javax.sql.DataSource的计划获取数据库连接。

在网上查找一下,原来MySQL在经过8小时不使用后会自动关闭已打开的连接,摘录原文如下:

透明和PreparedStatement的背后的数据源,可以“包装”围绕传统驱动程序或任意UNPOOLED的的数据源的连接池。c3p0的数据源都引用和序列化的,因此适合于宽各种基于JNDI命名服务结合。Statement和ResultSet的主要清理时,连接池和报表进行检查,以防止资源枯竭,当客户端使用的懒惰,但共同的资源管理策略,只清理自己的连接….

5.4. I have a servlet/application that works fine for a day, and then
stops working overnight

该库采用JDBC
2和3规格定义的方法。都写在JavaBean风格的数据源,提供所有必需的和最重要的可选属性(以及一些不规范的),无参数构造。
所有JDBC定义的内部接口的实现(ConnectionPoolDataSource的的PooledConnection
ConnectionEvent产生;连接等)兼容的第三方实现(虽然不是所有的c3p0的功能将与外部实现),你可以混合C3P0类。C3P0希望提供的DataSource实现多适合使用高容量的“JEE企业应用”。

MySQL closes connections after 8 hours of inactivity. You either need to
use a connection pool that handles stale connections or use the
“autoReconnect” parameter (see “Developing Applications with MySQL
Connector/J”).

要求:C3P0需要1.3.x或以上的Java Runtime
Environment,和JDBC2.x或以上javax.sql的库。
C3P0正常工作1.4.x和1.5.x版本更好。

Also, you should be catching SQLExceptions in your application and
dealing with them, rather than propagating them all the way until your
application exits, this is just good programming practice. MySQL
Connector/J will set the SQLState (see
java.sql.SQLException.getSQLState() in your APIDOCS) to “08S01” when it
encounters network-connectivity issues during the processing of a query.
Your application code should then attempt to re-connect to MySQL at this
point.
 

在Hibernate整合中C3P0实现连接池的步骤如下:

在客户那边,晚上时间是不会有人使用这个系统的,就造成了系统中原先没有考虑到的这个情况。

第一步,到

为此我试验了三种方法:

图片 1