一个原因是没有关闭MySQL的定时任务计划,每天凌晨MySQL会默认运行一个自动更新的定时任务计划,如果没有关闭,就会自动断开连接。
解决办法:
1、这是一个基本的权限问题。去MySQL安装目录下,右键单击MySQL文件夹,进入安全选项卡下,单击“编辑用户组”,在“组和用户”选择你的电脑的用户,选择允许的情况下所有的项,应用并关闭。
2、这是一个Windows的任务计划服务,删除即可,开始右键/计算机管理/任务计划程序/任务计划程序库/MySQL/Installer/ManifestUpdate,右键单击并选择“禁用”。另一个原因是MySQL数据库的数据库连接有生存期限制,如果在规定时间内没有操作数据库连接对象,连接就会被关闭。也就是常说的MySQL的8小时问题
MySQL服务器默认连接的“wait_timeout”是8小时,也就是说一个Connection空闲超过8个小时,MySQL将自动断开该 Connection。但是数据库连接池并不知道连接已经断开了,如果程序正巧使用到这个已经断开的连接,程序就会报错误。
先来了解一下数据库连接池:
用JAVA代码操作数据库需要数据库连接对象,一个用户至少要用到一个连接。现在假设有成千上百万个用户,就要创建十分巨大数量的连接对象,这会使数据库承受极大的压力,为了解决这种现象,一种技术出现了,这就是数据库连接池。
所谓数据库连接池,可以看作在用户和数据库之间创建一个“池”,这个池中有若干个连接对象,当用户想要连接数据库,就要先从连接池中获取连接对象,然后操作数据库。一旦连接池中的连接对象被拿光了,下一个想要操作数据库的用户必须等待,等待其他用户释放连接对象,把它放回连接池中,这时候等待的用户才能获取连接对象,从而操作数据库。
- 以下是两个连接池的简单实现~
代码来自:https://www.cnblogs.com/vmax-tam/p/4158802.html
代码来自:https://www.cnblogs.com/xiaotiaosi/p/6398371.html
代码我就不搬过来了,重点讲讲如何解决问题
方法一:修改数据库的等待时间
1、首先重启MySQL服务,开始→右键→计算机管理→服务,找到MySQL的服务,重新启动
2、设置MySQL最大等待时间,运行MySQL 5.7 Command Line Client,输入密码后,拷贝运行以下代码段:
show variables LIKE '%timeout%';
show global variables LIKE '%timeout%';
set global wait_timeout=2147483;
set wait_timeout=2147483;
set global interactive_timeout=31536000;
set interactive_timeout=31536000;
3、重启Tomcat
方法二:让自己编写的数据库连接池代码生成数据库连接对象时,增加一个自动刷新的功能,间隔时间自动生成一个新的数据库连接对象。也就是定期使用连接池内的连接,使得它们不会因为闲置超时而被 MySQL 断开。
方法三:连接数据库的时候加上autoReconnect=true这个参数:
jdbc:mysql://localhost:3306/accounant?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
方法四:减少连接池内连接的生存周期,使之小于上述项中所设置的“wait_timeout”的值。
方法五:将“testOnBorrow”设置为false,而将“testWhileIdle”设置为true,再设置好“testBetweenEvictionRunsMillis”值(小于8小时)。那些被MySQL关闭的连接就不会被清除出去,避免“8小时问题”。
例:http://www.totcms.com/html/201602-29/20160229114145.htm
Apache官方文档给出的配置示例可参见:http://tomcat.apache.org/tomcat-9.0-doc/