Hibernate MySql 连接池隔天断开
这样不是解决问题的办法啊,还有没有再好一点的办法了 展开
楼主用的连接池是C3P0吗?这里我以C3P0连接池为例来说明问题原因和解决方法。
问题原因:MySQL默认是自动关闭空闲超过8小时的连接,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成异常。重启Tomcat操作会使C3P0重新建立和数据库的连接池,且池内的连接都是有效的连接。
解决方法:c3p0要在8小时内关闭不使用的连接。这需要修改其中的一些配置参数,主要是maxIdleTime和idleConnectionTestPeriod。这两个参数的值要小于28800秒。
建议配置如下:
<!-- 每次都验证连接是否可用 -->
<property name="hibernate.c3p0.validate">true</property>
<!-- 检查连接池中所有空闲连接的间隔时间,单位为秒(要注意的是MySQL的自动关闭空闲超过8小时连接的机制) -->
<property name="hibernate.c3p0.idle_test_period">18000</property>
<!-- 连接的最大空闲时间,25000秒内未使用则连接被丢弃。单位为秒(要注意的是MySQL的自动关闭空闲超过8小时连接的机制) -->
<property name="hibernate.c3p0.timeout">25000</property>
附上在 hibernate中配置c3p0的关键字。
c3p0.acquireIncrement hibernate.c3p0.acquire_increment
c3p0.idleConnectionTestPeriod hibernate.c3p0.idle_test_period
c3p0.maxIdleTime hibernate.c3p0.timeout
c3p0.maxPoolSize hibernate.c3p0.max_size
c3p0.maxStatements hibernate.c3p0.max_statements
c3p0.minPoolSize hibernate.c3p0.min_size
不使用hibernate本身的连接池,采用c3p0连接池。
到了 Hibernate 3 默认第三方的连接池管理,
由 Apache 的 DBCP 项目更换成了 c3p0 项目。
它的属性在 Hibernate 配置属性有对应的写法,如:
c3p0.maxIdleTime = hibernate.c3p0.timeout
c3p0.maxPoolSize = hibernate.c3p0.max_size
所以,要修改一下 hibernate.cfg.xml 文档
将 Hibernate 默认连接池参数
<property name="connection.pool_size">5</property>
删除或注释掉,Hibernate 默认连接池比较初级。
然后,加入以下属性
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_size">5</property>
就可以使用 c3p0 来管理连接池了。
其实这些属性的参数名都可以在 Hibernate 文档 3.3 节
JDBC connections 里面找到。
按照相应的格式更改名字和值就可以了。
interactive_timeout=28800
wait_timeout=28800
重启mysql服务
这样不是解决问题的办法啊,还有没有再好一点的办法了
-------------
我公司很多项目用Hibernat连接池都是这样解决的.
楼主用的连接池是C3P0吗?这里我以C3P0连接池为例来说明问题原因和解决方法。
问题原因:MySQL默认是自动关闭空闲超过8小时的连接,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成异常。重启Tomcat操作会使C3P0重新建立和数据库的连接池,且池内的连接都是有效的连接。
解决方法:c3p0要在8小时内关闭不使用的连接。这需要修改其中的一些配置参数,主要是maxIdleTime和idleConnectionTestPeriod。这两个参数的值要小于28800秒。
建议配置如下:
<!--
每次都验证连接是否可用
-->
<property
name="hibernate.c3p0.validate">true</property>
<!--
检查连接池中所有空闲连接的间隔时间,单位为秒(要注意的是MySQL的自动关闭空闲超过8小时连接的机制)
-->
<property
name="hibernate.c3p0.idle_test_period">18000</property>
<!--
连接的最大空闲时间,25000秒内未使用则连接被丢弃。单位为秒(要注意的是MySQL的自动关闭空闲超过8小时连接的机制)
-->
<property
name="hibernate.c3p0.timeout">25000</property>
附上在
hibernate中配置c3p0的关键字。
c3p0.acquireIncrement
hibernate.c3p0.acquire_increment
c3p0.idleConnectionTestPeriod
hibernate.c3p0.idle_test_period
c3p0.maxIdleTime
hibernate.c3p0.timeout
c3p0.maxPoolSize
hibernate.c3p0.max_size
c3p0.maxStatements
hibernate.c3p0.max_statements
c3p0.minPoolSize
hibernate.c3p0.min_size