网上很多文章都说这两个参数需要同时设置才生效,其实是误解。
interactive_timeout 和 wait_timeout 必须同时设置才会生效。
我们看官方文档怎么说的?
interactive_timeout:Mysql交互连接(mysql命令行)的空闲等待时间,单位是秒,默认是8小时,建议不要将该参数设置超过24小时,即86400
wait_timeout:Mysql非交互连接(app应用的jdbc连接)的空虚等待时间,单位是秒,默认是8小时,建议不要将该参数设置超过24小时,即86400
这里好像不太一样,多了个 or,就是说session级别的 wait_timeout 值可以来自global wait_timeout的值,也可以来时 global interactive_timeout的值,这取决于客户端连接的类型(交互式的还是非交互式的)。
举个栗子:
1、查看当前默认值
show variables like ‘%timeout%’;
show global variables like ‘%timeout%’;
2、修改wait_timeout的值为14400
set global wait_timeout=14400;
这里发现wait_timeout的值session级别还是28800,只有global级别的值变成了14400。
3、退出会话,重新登录
还是跟上面一样,wait_timeout的值session级别是28800,global级别的值14400。
正如官方文档所说,这是因为mysql命令行登录属于交互式客户端,session级别的wait_timeout值由global级别的 interactive_timeout 参数决定(即28800)。
4、为了进一步验证这一点,我们通过python连接数据库进行查询
vi conn_mysql.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import mysql.connector
# 连接数据库
mydb = mysql.connector.connect(host=”10.0.1.1″,user=”root”,password=”XXXX“,database=”mysql”)
mycursor = mydb.cursor()
mycursor.execute(“show variables where variable_name in(‘interactive_timeout’,’wait_timeout’)”)
# 获取查询结果
myresult = mycursor.fetchall()
print myresult
mydb.close()
可以看到,这里通过非交互式连接,session级别的wait_timeout = 14400,符合官方文档的说明。
【总结】
interactive_timeout 参数和 wait_timeout 参数可以独立设置
sesseion级别的 wait_timeout 受客户端连接类型影响:
交互式连接(如:mysql命令行),则会话的 wait_timeout 的值等于 global interactive_timeout的值
非交互式连接(如:应用jdbc),则会话的 wait_timeout 的值等于 global wait_timeout的值