一、各种timeout参数的含义。
参数名称 | 说明 |
---|---|
connect_timeout | 该参数控制与服务器建立连接的时候等待三次握手成功的超时时间,该参数主要是对于网络质量较差导致连接超时,建议外网访问波动较大可以提高该参数。默认10,单位秒。 |
delayed_insert_timeout | 指INSERT语句执行的超时时间。默认300,单位秒。 |
innodb_lock_wait_timeout | 指锁等待的超时时间,该锁不同于死锁是指正常一个事务等待另外一个事务的S锁或者X锁的超时时间。默认50,单位秒。 |
innodb_rollback_on_timeout | 当事务超时超过该参数后即会回滚,如果设置为OFF即只回滚事务的最后一个请求。默认OFF,单位秒。 |
interactive_timeout wait_timeout |
mysql在关闭一个交互式/非交互式的连接之前所要等待的时间。建议不需要设置太长的时候,否则会占用实例的连接数资源。默认28800(8小时),单位秒。 |
lock_wait_timeout | 指定尝试获取元数据锁的超时时间。 |
net_read_timeout net_write_timeout |
指服务器端等待客户端发送的网络包和发送给客户端网络包的超时时间,这两个参数是对TCP/IP链接并且是Activity状态下的线程才有效的参数。 |
slave_net_timeout | 备实例等待主服务器同步的超时时间,超时后中止同步并尝试重新连接。 |
1、interactive_timeout:
控制的是交互式(如在mysql中通过黑色窗口连接)连接中sleep状态的连接的等待关闭时间,如果有sleep状态的连接超过了所设置的interactive_timeout的话则会被mysql关闭。
默认是8个小时,一般这个可以不去设置。
2、wait_timeout:
控制的是非交互式(如java之类的程序连接)连接中sleep状态的连接的等待关闭时间,如果有sleep状态的连接超过了所设置的wait_timeout的话则会被mysql关闭。
所以这里要注意,一般我们程序里用的hikari连接池之类的time_out设置要比mysql里所设置的time_out要小,不然会出现mysql把sleep的连接关闭了,而hikari连接池不知道连接关闭了再去使用出现连接错误的异常。
默认是8个小时,一旦用户量多很容易出现mysql中占满sleep的连接没被关闭从而导致maxconnetions的异常,
一般推荐设置wait_timeout为1-5分钟,而hikari连接池中的idle_time_out侧要比mysql的wait_timeout小1分钟左右,让hikari连接池里的空闲连接先自行失效。
3、查看默认的超时时间(单位秒)
二、配置和测试验证wait_timeout
1、如下:数据库中现有连接,
2、修改mysql的wait_timeout为10秒
set global wait_timeout=10;
3、配置spring boot工程进行测试
<dependencies>
<!--spring-boot-starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.9.RELEASE</version>
</dependency>
<!--spring-boot-starter-test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.3.9.RELEASE</version>
<scope>test</scope>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!--引入starter-jdbc,hireka连接池-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.3.9.RELEASE</version>
</dependency>
<!--引入mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!--引入junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--打包jar-->
<build>
<finalName>service-common</finalName>
<plugins>
<!--spring-boot-maven-plugin-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.2</version>
<!--解决打包出来的jar文件中没有主清单属性问题-->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
server.port=2003
spring.application.name=test11
# jdbc_config datasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://124.71.7.195:3306/gogs?serverTimezone=UTC&allowMultiQueries=true&characterEncoding=utf-8
spring.datasource.username=azhi
spring.datasource.password=azhi2021888
# Hikari will use the above plus the following to setup connection pooling
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=25
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=600000
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.connection-test-query=SELECT 1
4、程序中调用以下函数:
5、mysql中查看:
程序执行完之后再看还有没有这个3559连接,可以看到已经没有了:
6、结论:
测试结果,id为3559的连接是在Time刚好为30的时候关闭的,前20秒一直显示的是query,后10秒是sleep,Time到刚好在30的时候关闭,也就是空闲了10秒就被mysql关闭了,也刚好验证了设置mysql的wait_timeout设置为10秒起到作用了。