1

我是 Oracle DBA,而不是 Java 开发人员或 websphere 专家。我们最近开始在我们的环境中使用 websphere。所以开发人员仍在学习它。所以我可能无法正确表达我的问题。我确实搜索了论坛,并看到了其他 2 个类似的问题。我的问题更多是关于如何解决这个问题。

Websphere 8.5.0.2 Oracle 11.2.0.3

  1. 我在数据库中看到 20 个打开的连接。都是不活动的。所以他们没有处理。从 oracle 来看,它是 v$session。不活动意味着,你是开放的,没有做任何事情。基本上是闲置的。
  2. 如果它们处于非活动状态且未处理,则它们应该可供连接池提供给新的请求者,假设 Java 开发人员正在使用的 DAO 在完成时正在关闭(这包括 try/catch 块)。我们确认他正在关闭他的联系。

到目前为止的检查: 1. 我们审查了开发人员的代码。他正在使用标准的 java DAO。他正在关闭他的连接。他有一个 try/catch 块,他在 catch 中做的第一件事就是关闭连接。2.我的假设是这应该涵盖代码路径。

我们没有在日志中看到有关“关闭”连接的任何错误。

我对连接池如何工作的理解 1. 池管理器打开一组可配置的数据库连接。在我们的例子中,它是 20。 2. 当应用程序请求连接时,连接管理器会在池中查找下一个可用连接,然后将指向该连接的指针传递给请求函数。

可能性:1.服务器真的很慢。我们正在使用虚拟机进行开发/测试。我们无法查看服务器以查看它们是否忙碌。因此,另一个 VM 可能正在使用 CPU 或磁盘。尽管对可用连接的查找是轻量级的,但服务器可能会在 100% cpu 时挂起并且我们超时。问题是,我没有办法看这个。没有特权,也没有访问权限的人。

  1. 不关闭连接:我们检查得很彻底。我们没有看到他没有关闭连接的任何代码通过(包括异常)。他做的第一件事就是关闭连接。

关于在哪里看的任何建议?我认为这是服务器速度慢的问题,但我想排除其他问题。我想再次声明,我不是 Java 开发人员或 websphere 专家。所以我的问题可能措辞不佳。

4

2 回答 2

2

他在 catch 中做的第一件事就是关闭连接

让开发人员在 catch 块之后引入finally 块,并在 finally 块中关闭连接,而不是 catch 块。只有在出现错误的情况下,流才会移动到捕获,但在正常流中,连接不会很快释放。

try {
//do something 
}
catch(Exception ex) {
// log error
}
finally {
//close connection here
}
于 2013-05-23T16:52:41.457 回答
0

您描述的症状表明存在连接泄漏。泄漏很容易解决(参见 ad-inf 的回复),但很难找到泄漏的来源。幸运的是,WAS 带有ConnLeakLogic机制。启用它后,trace.log您会在应用程序从池中检索到的与连接相关的条目,并且在较长时间内没有返回。该连接信息还将从获得连接时打印 Java 线程的堆栈跟踪。看到堆栈跟踪,Java 开发人员应该能够识别有问题的代码。

于 2013-05-26T18:45:00.970 回答