日期:2014-05-18  浏览次数:20711 次

数据库连接没正确关闭导致的连接数过多,如何绕开确定问题所在位置
最近维护一个旧的项目。发现大概运行一两天就会出现too many connnections的提示。
很明显这之后数据库是访问不到了,程序中肯定是有某个地方没正确关闭connection导致错误发生
但是现在楼主不知道怎么定位这个问题。。项目文件太多了。。而且,是一个老项目,没用框架,用的原生jdbc连接,通过一个dbutil类的getconnection的方法来每次New连接使用
楼主开始想通过改造这个dbutil里面的getconnection方法,不从drivermanager获取连接,通过引入数据源,但是后来想想,引入数据源并没有改变问题,因为没正确关闭的连接依然存在。后来就想能不能通过从mysql数据库端把链接截掉。
网上查了个方法:
connection=jdbc:mysql://127.0.0.1:3306/aa?useUnicode=true&characterEncoding=GBK&connectTimeout=120000
通过设置这个connectionTimeout.但是实际试了下,大概10多个小时以后依然有这个问题。。x
想请教下各位大神。。
1、有没办法能够定位到具体是哪里的链接没正确关闭
2、如果没办法定位的话,能不能现在基础上加代码解决这个问题。。因为,这个没正确关闭肯定是某个try catch里面忘记加finally导致的。不可能是全部。。只是极个别方法的问题。所以希望大家给点工作量没这么大的方法我。在线等回复

------解决方案--------------------
改造getconnection 方法,改为从连接池中获取connection, 连接池会维护connection的使用。
------解决方案--------------------
个人想法 ;1,重构getConnection方法;2,在应用的外部接口上关闭多余的connection.
重构getconnection方法.设定一个threadLocal,将connection 放入threadLocal中。
实现逻辑如下:
1 判断threadLocal中是否有值,没有进入2.如果存在,进入3.
2 建立connection,将其放入threadLocal。返回connection
3 判断threadLocal中的connection是否关闭,如果关闭,进入2,如果没有关闭,进入4.
4 将threadLocal中的connection提交,然后返回此connection.

按照这个逻辑,应该能够保证一次请求最多存在1个连接泄露的情况。

在应用的外部接口上关闭多远的连接。
 也就是在请求完成时,在返回之前将threadLocal中存在可能没有关闭的connection关闭掉.
如果是web,就使用servlet的fiter等等到达这个目的,逻辑就是判断threallocal中是否有连接,同时判断是否关闭,如果没有关闭,就关闭它。
over。