赞
踩
使用德鲁伊数据库连接池且远程连接了同一个局域网下其他mysql数据库,使用几次获取连接的代码之后报错:too many connections。
开始我认为是没有关闭数据库连接导致出现这个情况,但通过多次核查确认了已关闭数据库连接,后续通过在mysql命令行窗口输入以下代码查看到了当前数据库连接数时发现确实已关闭该连接,当前处于休眠状态。
#查看当前数据库连接池连接信息:
show full processlist
但是当我重新获取连接时会重新开辟新的连接,而没有调用数据库连接池中的连接,由此一来,在多次调用数据库连接后连接池和数据库直接回产生很多连接,如下图所示:
通过show varialbles like "max_connections"命令可以查看出数据库默认的最大连接数为151,如下图所示。
当连接数超过151时再获取连接会如下错误
java.sql.SQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
通过造成问题的原因,有两种解决方法
方法一:增大数据库连接数
由于数据库默认的最大连接数是151,当我们超过151个连接时,就会造成异常,我们可以更改数据库的最大连接数,使用命令set global max_connections=1000,将数据库的最大连接数更改为1000,由此数据库的最大连接量便扩大成了1000,暂时不会出现too many connections报错。
方法二:缩短最大睡眠时间
通过show global variables like "wait_timeout"命令可以查看当前数据库的最大睡眠时间,数据库默认是8小时,可以使用set global wait_timeout=60,将数据库的最大睡眠时间更改为1分钟,这样超过一分钟没使用的数据库连接就会自动关闭了。
小结:
在远程连接同一个局域网下其他mysql数据库,使用德鲁伊数据库连接池获取连接时,无法正常启用数据库连接池中的连接,每一次都是获取到新的连接。
而使用Connection的close()方法只是关闭了实现类和连接池中的连接,当并未真正的关闭连接池和数据库之间的连接,当我们需要获取新的连接时可以直接从数据库连接池中获取连接,不用获取重新向数据库获取连接。
使用这两个方法可以暂时解决“too many connections” 的问题,但感觉治标不治本,导致这个问题的根本原因是获取连接时,无法使用已休眠的连接,而是每次都获取新的连接导致的,通过以上方法虽能解决问题,但无法发挥出使用数据库连接池的优势。如有大神知道如何从根本上解决问题,望请赐教!
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。