开发者社区> 朱小厮> 正文

MySql数据库连接超时处理

简介: 博主在做web开发时遇到MySql数据库连接超时的问题。 控制台报错如下: Request processing failed; nested exception is org.springframework.
+关注继续查看

博主在做web开发时遇到MySql数据库连接超时的问题。

控制台报错如下:

Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure Last packet sent to the server was 1 ms ago.

由于用到了spring+mybatis的框架,刚开始以为是mybatis引起的,后来才发现是MySql数据库连接超时。

这个异常是由于MySQL服务再长时间不连接之后断开了,断开之后的首次请求会抛出异常。那么既然是超时问题,就要去探究一下Mysql连接时间是怎么控制的。打开Mysql的控制台,运行:show variables like '%timeout%'; ,查看和连接时间有关的Mysql系统变量,如图:


其中wait_timeout就是负责超时控制的遍历,其时间为长度28800s,就是8个小时,那么就是说Mysql的服务会在操作间隔8小时后断开,需要再次重连。

interactive_timeout:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。

    wait_timeout:服务器关闭非交互连接之前等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。

    如此看来,两个变量是共同控制的,那么都必须对他们进行修改了。继续深入这两个变量wait_timeout的取值范围是1-2147483(Windows),1-31536000(linux),interactive_time取值随wait_timeout变动,它们的默认值都是28800。

Mysql的系统变量由配置文件控制,当配置文件中不配置时,系统使用默认值,这个28800就是默认值。Linux系统下的配置文件为/etc/my.cnf,windows下在[MySQL_HOME]/bin下的mysql.ini。

修改之后保存退出,重启mysql服务。

如果不修改mysql的配置,需要直接在spring-mybatis的配置文件中实现,可以采用以下的方式:

	<bean id="mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" 	value="${mysql_driver}"/>
		<property name="url" 		value="${mysql_url}"/>
		<property name="username" 	value="${mysql_username}"/>
		<property name="password" 	value="${mysql_password}"/>
		<property name="validationQuery" 	value="SELECT 1"/>
		<property name="testOnBorrow" 		value="true"/>
	</bean>
如上面代码所示,dirverClassName,url,username,password是数据库的连接配置,都很常见。关键是validationQuery和testOnBorrow两个参数。Spring建议使用的数据源有Apache的DBCP和C3P0,这里使用的是DBCP,前面四个参数是基本参数,而后面两个参数是连接健康情况的参数,如下图所示:

添加了validationQuery和testOnBorrow两个参数可以保证在mysql服务长时间不连接断开之后的请求不会出现异常情况,当然也可以在配置文件中将testOnReturn等之类的配置加上。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Qt之处理QNetworkAccessManager网络连接超时
简述 在网络操作中,经常会由于各种原因引起网络连接超时,究竟何为网络连接超时? 网络连接超时:在程序默认的等待时间内没有得到服务器的响应 简述 超时原因 Qt 中的网络连接超时 如何处理超时 封装类 超时原因 引起网络连接超时的原因很多,下面,列举一些常见的原因: 网络断开,不过经常显示无法连接 网络阻塞,导致你不能在程序默认等待时间
4344 0
阿里云ECS连接数据库教程方法
阿里云ECS云服务器如何连接RDS云数据库?云吞铺子总结首先将ECS加入到RDS白名单,然后获取到RDS的连接地址、RDS的数据库用户名、密码及数据库名即可连接,云吞铺子分享详细的操作方法: 将ECS添加到RDS的白名单中 出于安全考虑,RDS默认自带了白名单规则,想要让ECS连接RDS数据库必须.
5185 0
批处理命令 BAT备份MySQL数据库
原文:批处理命令 BAT备份MySQL数据库 工作环境 Windows Server 2003 ,MySQL安装目录 D:\MySQL , WinRAR 安装目录 C:\Program Files\WinRAR\WinRAR.exe 备份数据存储的路径为 E:\数据备份,好了下面开始写DOS批处理命令了。
911 0
MVC3、如何应用EntityFramework 连接MySql 数据库
原文:MVC3、如何应用EntityFramework 连接MySql 数据库 新的一年,新的开始。 今天总结的主题是在MySql中应用EntityFramework 的Code First模式。 开发环境:Win8 + MySql5.5 +VS 2012. 第一步是在数据库中新建一个表,具体字段如下图。
1081 0
使用xshell-ssh连接服务器被经常意外中断(Disconnected from remote host)
最近使用Xshell使用服务器,经常连接上使用一会就会被自动中断,很是闹心,并且出现以下的错误提示: Socket error Event: 32 Error: 10053.
8325 0
+关注
朱小厮
主要从事消息中间件的相关研发工作,著有《RabbitMQ实战指南》。
210
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载