【问题标题】:Java - Orcale could not open JDBC connection for transactionJava - Oracle 无法为事务打开 JDBC 连接
【发布时间】:2021-01-23 11:17:59
【问题描述】:

我正在处理一个非常大但实施不佳的项目,我们遇到了一个与 de Database 相关的大性能问题。 我们正在使用 Oracle、exadata 和 bla bla bla。 应用服务器:tomcat 潜水员:ojdbc6

接下来的配置:

<property name="connectionCachingEnabled" value="true" />
<property name="connectionCacheProperties">
<value>
MinLimit:180
MaxLimit:200
InitialLimit:50
ConnectionWaitTimeout:120
InactivityTimeout:180
....

该应用程序有近 15 个独立运行的模块,但也有一些模块包含其他模块并使用它们的数据源。

是的,我知道……你在想什么。当我到达时它已经是这样了,我需要修补它,同时团队正在努力工作 再造

问题是这 15 个模块应该占用 200 个连接,但是对于这个意大利面条,每个模块还占用包含的模块连接。

这是一个连接汤!

但在这一点上,问题是某些模块无法获取它们的 200 个连接,因为数据库没有更多资源,所以.... 与“ConnectionWaitTimeout”配置相关,它返回一个漂亮的 null 到池中,并带有下一条消息:

无法为事务打开 JDBC 连接;嵌套异常是 java.lang.IllegalArgumentException:连接不能为空

检查数据库大部分模块需要 200 个连接,但只有 7 个活动和 197 个不活动。

我找不到合适的配置来释放不活动的配置。

我使用了 InactivityTimeout 和 AbandonedConnectionTimeout,但问题仍然存在。

【问题讨论】:

  • MinLimit:180 听起来好像池将始终打开至少 180 个连接(并将保持它们打开)。是否将其设置为例如5 改变什么?
  • 当我们把它改成较低的值,结果是一样的

标签: java oracle tomcat ojdbc


【解决方案1】:

在不分析应用程序的情况下,我们只能推测为什么会出现此问题。

  1. 自创建了 197 个连接(超过 180 个)以来,应用程序似乎从池中请求了如此多的连接。
  2. 由于非活动超时没有帮助,我们必须假设应用程序仍保留连接。
  3. 现在由于放弃超时没有帮助,有两种可能性。
    A) 应用程序确实在超时期限内查询数据库。
    B) 池回收了连接,应用程序应该已经捕获到异常并重试

我建议你理解模块1中的代码以了解连接使用模式。

【讨论】:

  • 是的,你是对的,应用程序的负载高峰会产生这种数据库消耗,但我需要找到在高峰后断开连接的方法。
猜你喜欢
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2013-08-09
  • 1970-01-01
  • 2014-08-28
  • 2017-07-08
  • 2019-06-10
相关资源
最近更新 更多