锁定老帖子 主题:如何截获JBoss的数据源?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-02
现在的问题是,我的服务器是jboss,使用jboss的连接池,如何截获这些连接池并进行代理,我还没有想到很好的方法。 (可能我的表述不是很好,不过大致就是这样) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-01-02
liangguanhui 写道 近来接手一个旧项目,发现有时会出现连接找不到的异常,很显然是因为某个地方没有正确释放数据库连接造成。我打算使用代理数据源的方法,然后代理connection、代理statement,一直找到没有释放连接的地方和所执行的sql语句。
现在的问题是,我的服务器是jboss,使用jboss的连接池,如何截获这些连接池并进行代理,我还没有想到很好的方法。 (可能我的表述不是很好,不过大致就是这样) 未必是没有释放数据库连接造成的。如果是这样,你直接监控数据库服务器就可以看出来。用不着在连接池上动手脚。 |
|
返回顶楼 | |
发表时间:2007-01-02
关键是我没有数据库管理的权限
|
|
返回顶楼 | |
发表时间:2007-01-02
如果是用tomcat的DBCP连接池,他有参数可以设置,以自动监测未释放的链接。不知道JBOSS的连接池有没有类似的特性。
|
|
返回顶楼 | |
发表时间:2007-03-22
DBCP千万不能用,我们上线的项目有几个发现都是DBCP造成死锁引起系统down机(thread dump)
|
|
返回顶楼 | |
发表时间:2007-03-22
我也遇到这种问题
解决这个问题是在太搞了,问题有可能要1天2天才出现,用代理的方法根本行不同,因为你根本不知道别人到底在什么地方获取这个Connection,而且jboss连接池如果设置了超时是不会有这样的问题的,有可能的只是有人没从连接池拿对象,而是自己直接拿的,用完后又没关!同时代理是针对接口,如果大家从同1个接口拿connection就不会有你刚才的问题,你代理下来也没用(而且代理你也捕获不到什么有用的信息,还是得写log). 我当时是把log等级调大,从info的log开始写,等问题出现后去查log,然后翻代码? |
|
返回顶楼 | |
发表时间:2007-03-22
我现在是这样,把所有地方的获取Connection都统一起来,然后用代理。
|
|
返回顶楼 | |
发表时间:2007-03-22
用代理的方法根本行不同,因为你根本不知道别人到底在什么地方获取这个 Connection,而且jboss连接池如果设置了超时是不会有这样的问题的,有可能的只是有人没从连接池拿对象,而是自己直接拿的,用完后又没关! 同时代理是针对接口,如果大家从同1个接口拿connection就不会有你刚才的问题,你代理下来也没用(而且代理你也捕获不到什么有用的信息,还是得写log). 我当时是把log等级调大,从info的log开始写,等问题出现后去查log,然后翻代码? |
|
返回顶楼 | |
发表时间:2007-03-22
我的思路如下:
(1)把所有获取Connection的地方都统一起来,从同一个入口获取。这一步比价浪费事件 (2)构造代理。我的代理是这样的,代理从连接池里获取的Connection,在这个Connection的close方法做标记,然后检测一定事件后(我是设了10秒)还没有执行close方法的connection。 (3)至于从这个connection里怎样得到有用的信息,那就各位自由发挥了,我是构造了一个Exception,然后输出他的stack,并且代理他的Statement和PreparedStatement,输出它执行过的SQL语句。 |
|
返回顶楼 | |
发表时间:2007-03-22
我觉得你这个方法可能找不到问题得所在!
1:如果所有得程序从同一个接口获取Connection,并且你这个接口得实现是从连接池获取,只要你得pool设置了超时,那么jboss会维护这个池里面得对象,对于超过时间得连接会自动关闭,然后刷新连接池! 所以你代理这个接口是没有意义得!由于我遇到过这个问题! 而且连接不被释放也不一定是程序得问题!还有下面得原因会引起!!! 容器处理一个很长得request响应,导致数据库挂掉 连接池设置不当,导致连接被clone! 超时时间设置得太短等! 程序中长响应比较多 |
|
返回顶楼 | |