再淡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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言:字符数组的输入输出

    C语言:字符数组的输入输出目录用printf输出用scanf输入用gets输入用puts输出 用printf输出 输出方法1:printf逐个字符输出。  voidmain(void){   charc[ ]="Iamhappy";     inti;      for(i=0;i&lt;10;i++){ …

    2022年7月27日
    5
  • 二维码生成器小程序_小程序二维码制作

    二维码生成器小程序_小程序二维码制作使用Taro框架写小程序,生成二维码,在微信开放平台找到一个特别好用的二维码生成器(可在原生小程序,mpvue,taro中使用)文档地址:微信开放平台文档地址)github地址:github地址,有详细的描述在taro中使用1、安装npmiwxmp-qrcode2、使用importQRfrom’wxmp-qrcode'<canvasid={this.state…

    2025年6月13日
    0
  • c++全局变量与静态变量「建议收藏」

    c++全局变量与静态变量「建议收藏」概述:全局变量和和由static修饰的静态变量都被储存在全局数据区。全局数据区的内存在程序运行时会被全部置’0′.这不同于局部变量,局部变量在栈上分配内存,但此块内存一般不为零,且编译器不会在局部变量被声明的地方为其置’0′,除非申明时对其初始化值为0.全局变量:申明在main函数外的变量被编译器视为全局变量。即其在整个文件的任何地方都可以使用它。对于其他源文件来说,全局变量…

    2022年5月13日
    35
  • linux关闭防火墙命令_防火墙配置策略

    linux关闭防火墙命令_防火墙配置策略在外部访问CentOS中部署应用时,需要关闭防火墙。关闭防火墙命令:systemctlstopfirewalld.service开启防火墙:systemctlstartfirewalld.service关闭开机自启动:systemctldisablefirewalld.service开启开机启动:systemctlenablefirewalld.service…

    2022年9月6日
    4
  • VMware安装centos7(电动卷闸门安装方法及步骤)

    原文:https://www.jianshu.com/p/ce08cdbc4ddb?utm_source=tuicool&utm_medium=referral本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下1.软硬件准备软件:推荐使用VMwear,我用的是VMwear12镜像:CentOS7,如…

    2022年4月12日
    43
  • Hibernate进阶之如何使用Hql内连接,外连接以及自连接

    Hibernate进阶之如何使用Hql内连接,外连接以及自连接

    2021年9月26日
    51

发表回复

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

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