再淡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


相关推荐

  • ncnn笔记_cnn代码

    ncnn笔记_cnn代码最近看了ncnn的源码,代码风格清爽,遂想先抛开VULKAN记录一下它的推理流程。1. 先看个yolov2democsdn上的帖子https://blog.csdn.net/sina

    2022年8月6日
    10
  • java 初始化数组_Java中数组的初始化

    java 初始化数组_Java中数组的初始化一 什么是初始化在 Java 程序开发中 使用数组之前都会对其进行初始化 这是因为数组是引用类型 声明数组只是声明一个引用类型的变量 并不是数组对象本身 只要让数组变量指向有效的数组对象 程序中就可使用该数组变量来访问数组元素 所谓数组初始化就是让数组名指向数组对象的过程 该过程主要分为两个步骤 一是对数组对象进行初始化 即为数组中的元素分配内存空间和赋值 二是对数组名进行初始化 即为数组名赋值为数组

    2026年3月26日
    3
  • wamp配置虚拟机步骤

    wamp配置虚拟机步骤

    2021年10月10日
    48
  • Macbook air/pro m1 恢复出厂设置小记

    Macbook air/pro m1 恢复出厂设置小记今日手抽,想恢复下出厂,看了官方教程https://support.apple.com/zh-cn/HT211983够,按照说明一步一步进行,然鹅~在正确抹掉2遍开始选择重装bigsur时发现无法找到硬盘。经摸索,解决方法:再次重启进去恢复模式,选择磁盘工具,点击显示所有卷宗,这时发现硬盘处于非格式化状态,因而无法被安装程序识别,(点击+号新建afps分区时会提示无效的arg,无法新建分区)应选择抹除,来重新抹盘,即可解决问题。返回到恢复界面,就能发现硬盘并正常重装。注:这个问题用u盘进行引导安装时也一

    2022年6月17日
    242
  • [转]Asp.Net MVC 扩展联想控件

    [转]Asp.Net MVC 扩展联想控件

    2021年8月24日
    39
  • 【制作CSS气泡框】

    气泡状文本框,是一种很生动的网页设计手段。它可以用来表示用户的发言…

    2022年1月18日
    39

发表回复

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

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