再淡spring jdbc 连接池断开重连设置

再淡spring jdbc 连接池断开重连设置

大家好,又见面了,我是全栈君。

先看一段错误日志:

### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
### The error may exist in file …………]
### The error may involve .....
### The error occurred while executing a query
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
; SQL []; No operations allowed after connection closed.; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

这个是连接池断开后(网络、数据库断开)。没有确认池里的连接继续可用的情况下,去操作数据库。

网上一搜,解决的方法一大堆,基本配置例如以下:

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<!-- 队列中的最小等待数 -->
		<property name="minIdle" value="${jdbc.minIdle}"></property>
		<!-- 队列中的最大等待数 -->
		<property name="maxIdle" value="${jdbc.maxIdle}"></property>
		<!-- 最长等待时间。单位毫秒 -->
		<property name="maxWait" value="${jdbc.maxWait}"></property>
		<!-- 最大活跃数 -->
		<property name="maxActive" value="${jdbc.maxActive}"></property>
		<property name="initialSize" value="${jdbc.initialSize}"></property>
		<property name="validationQuery" value="select 1"/>
		<property name="testOnBorrow" value="false"/>
		<property name="testWhileIdle" value="true"/>
		<property name="testOnReturn" value="false"/>
		<property name="numTestsPerEvictionRun" value="${jdbc.maxActive}"/>
		<!-- 5 min 每5分钟检測空暇连接超过10分钟的连接-->
		<property name="timeBetweenEvictionRunsMillis" value="300000" />  
		<property name="minEvictableIdleTimeMillis" value="600000" /> 
		<property name="removeAbandoned" value="true"/>
	</bean>





但是,这就够了吗?

一開始放到自己的环境上是没实用的,还是报错了。

继续努力,最后是攻克了。

第一要理解连接池的各项配置(上面)

第二是要知道mysql中wait_timeout的设置

两点结合才干确定连接池在项目中的合理正确配置。

假设wait_timeout设置成非常大一个值,比如一年,那么上面的配置非常多情况下都是正确的。

假设wait_timeout设置成非常小,如1分钟,那么上面的配置是有问题的。

由于server1分钟就把空暇连接断开了,client过了5分钟再去检查连接情况,那有什么意义?先前就是没理解被误导了,把timeBetweenEvictionRunsMillis设置了一个比較大的值,所以一直有问题。包含所说的8小时问题也是源于此(mysql数据库默认是空暇8小时断开)。

我的原因是mysql的wait_timeout的值设置小了。而client检測的间隔时间过大。

正确的做法是:

连接池配置中的timeBetweenEvictionRunsMillis和

minEvictableIdleTimeMillis的

时间小于或者等于mysql数据库中wait_timeout的时间。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116196.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月24日 下午6:00
下一篇 2022年1月24日 下午7:00


相关推荐

  • AI 代理的上下文工程:来自 Manus 的一线经验

    AI 代理的上下文工程:来自 Manus 的一线经验

    2026年3月15日
    1
  • js保留两位小数方法总结

    js保留两位小数方法总结一 我们首先从经典的 四舍五入 算法讲起 1 四舍五入的情况 12varnum 2 num num toFixed 2 输出结果为 2 452 不四舍五入第一种 先把小数边整数 1Math floor 15 100 100 输出结果为 15 77 第二种 当作字符串 使用正则匹配 1Number

    2026年3月19日
    4
  • 网络传真文档转换「建议收藏」

    网络传真文档转换「建议收藏」
    进公司不久,就到一个棘手的任务,公司决定对原有网络传真文档转换进行改造,原有方案是通过虚拟打印,这家伙有几个不好的地方
    1。只能运行在win系列上。
    2。 虚拟打印只能同步访问,需要排队等候
    3,   不稳定,经常需要重启
    经过将近一个月的摸索与研究,现将思路与实现方案记录下来。
    首先通过openoffice一个开源项目jodconverter将office系列文档转换成pdf。
    然后通过ghostscript将pdf转换成传真

    2022年6月28日
    30
  • 【运维篇】resize2fs命令 – 调整文件系统大小

    【运维篇】resize2fs命令 – 调整文件系统大小resize2fs命令是用来增大或者收缩未加载的“ext2/ext3/ext4”文件系统的大小。语法格式:resize2fs[参数][文件]常用参数:-d 打开调试特性 -p 打印已完成的百分比进度条 -f 强制执行调整大小操作,覆盖掉安全检查操作 -F 开始执行调整大小前,刷新文件系统设备的缓冲区 参考实例调整逻辑卷文件系统大小:[root@linuxcool~]#resize2fs/dev/linuxprobe/vo打开调试特性

    2022年10月21日
    3
  • 小白都能学会的git的命令操作

    小白都能学会的git的命令操作

    2021年8月3日
    89
  • 递归和迭代有什么区别?

    递归和迭代有什么区别?“递归”和“迭代”的区别如下:1、递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合。2、迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用…

    2022年6月6日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号