HikariCP踩坑-Too-many-connections

Posted by AlstonWilliams on February 17, 2019

从昨天开始,我们突然遇到了一个问题,就是连接到数据库时,提示Too many connections.即使知道这个错误是由于同时打开的连接数太多导致的,然而还是有点懵.因为即使我停止了微服务,在通过show status查看MySQL的当前连接数,还是没有变化.

一天中出现了两次这样的错误,由于没有时间来解决,所以我只能暂时通过重启MySQL的做法,来暂时处理一下.但是这样终究不是长远之计.

我们通过show processlist命令,发现大多数连接都处于sleep状态,也就是说,并没有被使用,也没有被释放.而HikariCP确实在微服务被停止时,被关闭了.于是猜测是微服务被关闭时,出了些问题,比如突然断网了,导致MySQL只好等待一定的超时时间,等到请求超时之后,才关闭连接.

而这个超时时间一般不应该是很短吗?为什么连接在微服务停止后的半个小时之后都没有被释放?

实际上,这个超时时间,默认是八个小时!!!

在MySQL的配置文件中,使用wait_timeout这一项来表示.

这么长的超时时间,对于使用连接池的有状态的Java应用来说,可能正好合适.但是对于一些不使用连接池的应用来说,如果连接没有被正确关闭,就要等待8小时超时之后才能关闭,未免有点浪费资源.这样很快就到达了MySQL的max_connections限制,导致出现Too many connections这个错误.

实际上,在我们开发阶段,因为使用了连接池,反而更加助纣为虐,因为我们需要频繁的关闭并重新打包微服务,然后重新运行,每次运行,都需要新建一个有200个连接的连接池,而我们的MySQL的**max_connections **总共才300.这样在第二次运行时,就会出现错误.

所以,我们先调整一下MySQL的wait_timeout,将其调整成10分钟,同时,减少Hikari连接池的建立的连接数,将其调整成10.

而且,我注意到,只有当我的HikariCP连接池设置的很大时,出现了Too many connections错误时,此时停止微服务,才会导致连接并没有被完全释放.不知道是否是HikariCP连接池的bug.有时间阅读一下源码,看一下.