背景:
是个很简单的增删改查应用,springboot + mysql + tomcat,测试环境在单台服务器上跑得好好的。生产环境是两台服务器,一台主机,一台备机。代码在俩台机器上分别部署一遍,都连接到同一个 mysql 上,这个 mysql 在第三台服务器上。
问题:
上线之后先后出现了俩个问题,第一个是数据库连接失败,主备机上 telnet mysql 也不通。按照百度来的办法把 ip 地址加到 user 表上,这个问题解决了。紧接着出现了第二个问题,俩台机器的应用都跑起来以后,通过域名访问(应该是随机分配到某一台机器上),要么是登录长时间没响应(这种情况日志里报错是 关于flush hosts命令的),要么是登陆成功以后立刻退出(真的是立即退出,可以在浏览器的控制台看到请求主页,然后又退回到登录界面了,而且这种情况日志里不报错)。
尝试解决办法:
去掉 DNS 反解析、增加最大连接数、用 flush hosts
命令、分配不同的用户和密码,都没有用。尝试过关掉一台机器,只跑另外一台机器的代码,这样做就不出现这个问题了,俩台机器这样做都没问题(但是关掉一台肯定是不行的,而且没有从根本上解决问题)。
用 show processlists;
命令查看,可以看到有一台机器发送了很多请求,而且 time 列都是 null(把 ip 地址隐去了,但是这都是是同一台机器发送的,就叫这台机器主机可以了)
在服务器上用 netstat 命令查看 3306 端口也能看到同一台机器在向这里请求。
其它的信息就是这个系统还没什么人用,没有什么并发的问题。
版本:jdk 1.8,mysql 5.5,tomcat 8。我设置的 session 过期时间是 5 分钟。
这个问题困扰我俩天了,还望各位高手解惑,叩谢。
如果系统还没人用就连接数超限,肯定是代码写得有问题,你可以定位查看是什么地方的代码发起这些数据库连接,把tomcat启动起来,然后关闭mysql,这样spring boot程序肯定抛出一大堆无法连接数据库的异常,你就可以看出是在什么地方发出的数据库连接,是否合理了。