我的mysql遇到过这个问题,我记得高斯数据库也有这个问题,写此记录:
org. springframework. transaction. CannotCreatelransactionException: Could not open JDBc Connection for transaction;
c3p0连接池的testConnectionOnCheckout属性,类似于autoReconnect属性可自动保持数据库的连接,在获取连接时先检查连接是否有效(即检查Connection是否被mysql数据库关闭了),如果连接无效就重新建立一个新的连接。
1、下载相关JAR包;
在Maven Repository中下载c3p0相关jar包,将c3p0-0.9.2.1.jar 拷贝至项目中。
2、在数据库配置文件中,添加c3p0连接池配置,配置如下:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialPoolSize" value="25"/>
<property name="minPoolSize" value="25"/>
<property name="maxPoolSize" value="50"/>
<property name="acquireIncrement" value="5"/>
<property name="testConnectionOnCheckout" value="true"/>
</bean>
上面配置中最重要的就是hibernate.c3p0.testConnectionOnCheckout这个属性,它保证每次取出连接时都会检查该连接是否被关闭,如果被关闭,则重新建立连接。
简单两步就搞定了mysql超时自动重连的问题了。
${jdbc.driverClass}等数据库连接具体内容我是写到properties文件里的,你也可以直接写上去
3、测试验证
①修改mysql默认超时time,超时参数设置的比较小(设置为1min)
SHOW GLOBAL VARIABLES LIKE 'wait_timeout';
SHOW GLOBAL VARIABLES LIKE '%timeout%';
SET GLOBAL wait_timeout=60;
SET GLOBAL interactive_timeout=60;
我的是mysql,默认等待时间是28800秒吧,搞完记得改回去,有查询语句自己看
②启动web工程,登录系统,然后等待1分钟以上,再次操作系统检查是否会报mysql连接错误
经过验证,发现c3p0连接池配置能有效解决mysql超时重连问题。
参阅文档:
hibernate配置参数详解:
https://blog.csdn.net/javahuangfang/article/details/8269314
c3p0常用配置参数:
https://blog.csdn.net/zhanghanlun/article/details/80918422
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/Huozhiwu_11/article/details/106550566