MySql数据库连接超时处理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 博主在做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等之类的配置加上。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
存储 Go API
使用GoFrame连接和操作TDengine时序数据库
通过使用GoFrame框架和TDengine Go驱动,我们可以方便地连接和操作TDengine时序数据库。无论是插入、查询还是分析时序数据,都可以通过简单的API调用来实现。GoFrame提供了强大的Web开发功能,结合TDengine的高性能时序数据存储和查询能力,可以构建高效、可扩展的时序数据应用。
|
13天前
|
NoSQL 关系型数据库 PHP
php连接数据库
要使用PHP连接PolarDB或MongoDB数据库,需先准备连接信息,并编写相应代码。对于PolarDB,需设置主机地址、端口、数据库名及凭据,使用`pg_connect`函数建立连接;而对于MongoDB副本集,需安装MongoDB PHP驱动,通过`MongoDB\Client`连接指定的副本集实例。请确保替换示例代码中的占位符为实际值,并正确配置副本集名称和主机信息。更多详细信息与示例代码,请参考相关链接。
124 72
|
1月前
|
关系型数据库 MySQL 网络安全
有关使用Navicat 无法成功连接腾讯云服务器上Mysql的问题解决
这篇文章提供了解决Navicat无法连接腾讯云服务器上MySQL问题的步骤,包括调整防火墙设置、更新MySQL权限和检查远程连接配置。
有关使用Navicat 无法成功连接腾讯云服务器上Mysql的问题解决
|
20天前
|
SQL Java 数据库连接
Java开发者必知:JDBC连接数据库的“三大法宝”
Java开发者必知:JDBC连接数据库的“三大法宝”
17 7
|
22天前
|
安全 Java 关系型数据库
Java连接Mysql SSL初始化失败
Java连接Mysql SSL初始化失败
|
25天前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
42 3
|
26天前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
1月前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。
|
1月前
|
SQL Java 数据库连接
连接数据库修改用户信息
该博客文章通过Java JDBC代码示例演示了如何连接SQL Server数据库,并执行更新操作来修改用户信息,具体将小张的工作改为教授,并检查更新操作是否成功。
|
20天前
|
SQL 数据库 开发者