java web 应用,mysql 创建连接数过多的问题

背景:
是个很简单的增删改查应用,springboot + mysql + tomcat,测试环境在单台服务器上跑得好好的。生产环境是两台服务器,一台主机,一台备机。代码在俩台机器上分别部署一遍,都连接到同一个 mysql 上,这个 mysql 在第三台服务器上。

问题:
上线之后先后出现了俩个问题,第一个是数据库连接失败,主备机上 telnet mysql 也不通。按照百度来的办法把 ip 地址加到 user 表上,这个问题解决了。紧接着出现了第二个问题,俩台机器的应用都跑起来以后,通过域名访问(应该是随机分配到某一台机器上),要么是登录长时间没响应(这种情况日志里报错是 关于flush hosts命令的),要么是登陆成功以后立刻退出(真的是立即退出,可以在浏览器的控制台看到请求主页,然后又退回到登录界面了,而且这种情况日志里不报错)。

尝试解决办法:
去掉 DNS 反解析、增加最大连接数、用 flush hosts 命令、分配不同的用户和密码,都没有用。尝试过关掉一台机器,只跑另外一台机器的代码,这样做就不出现这个问题了,俩台机器这样做都没问题(但是关掉一台肯定是不行的,而且没有从根本上解决问题)。
show processlists; 命令查看,可以看到有一台机器发送了很多请求,而且 time 列都是 null(把 ip 地址隐去了,但是这都是是同一台机器发送的,就叫这台机器主机可以了)
bug1__.png
在服务器上用 netstat 命令查看 3306 端口也能看到同一台机器在向这里请求。
bug2__.png
其它的信息就是这个系统还没什么人用,没有什么并发的问题。
版本:jdk 1.8,mysql 5.5,tomcat 8。我设置的 session 过期时间是 5 分钟。

这个问题困扰我俩天了,还望各位高手解惑,叩谢。

阅读 2.3k
1 个回答

如果系统还没人用就连接数超限,肯定是代码写得有问题,你可以定位查看是什么地方的代码发起这些数据库连接,把tomcat启动起来,然后关闭mysql,这样spring boot程序肯定抛出一大堆无法连接数据库的异常,你就可以看出是在什么地方发出的数据库连接,是否合理了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题