java.sql.SQLNonTransientConnectionException 故障排除:连接不存在

问题描述 投票:0回答:1

Java 应用程序(在 Windows 服务器上)旨在接收嵌入 XML 中的请求并转换请求,从而在 iSeriese IBM 机器上执行 SQL。这是一个多线程应用程序,通常会大量处理此类请求。它在所有环境中都能正常工作,但是突然间,我们开始看到以下模式,其中包含导致进程中断的错误:

  1. 收到请求。
  2. 将其翻译为 SQL。
  3. 打开与数据库的连接或使用现有的数据库(如果可用)。
  4. 执行SQL,并获取结果。
  5. 提交流程。
  6. 关闭连接。
  7. 有时,我们会随机看到此错误:
    java.sql.SQLNonTransientConnectionException: The connection does not exist

在日志中,我们几乎一致地看到上述模式,当我研究错误时,大多数人都说我们需要将

validationQuery
添加到连接池定义或连接字符串中。这样做的目的是帮助进行故障排除,这可能需要一些时间才能找到根本原因,此外,我需要找到可能导致此错误的合理解释,例如如下:

有多个线程并行运行,并且代码正在关闭连接,因此,由于计时问题,JDBC 引擎可能会尝试使用刚刚被另一个线程关闭并从池中删除的连接。

考虑这种情况:线程 T1、T2、T3...Tn 都在使用该连接,并且它们都成功,但在 1 和 n 之间的中间位置进行了一些尝试。比如线程Ty,关闭连接失败,可能是因为它启动的时候,DB Connection被复用了,SQL执行成功了。

然而,当 Ty 尝试关闭连接时,并没有发现它可能在前一个线程 Tx 完成 SQL 处理并关闭/删除连接后被删除,因为它是使用以下任意有效组合打开的:以下参数

validationQuery, validationQueryTimeout, validationInterval, maxAge, testOnBorrow,testOnReturn, testWhileIdle, validationInterval
.

然后,线程 Tz 成功处理 SQL,因为该过程从头开始,打开一个新连接。

感谢您对我的上述解释提供反馈,并提供任何其他信息来解决此问题。

java sql ibm-midrange
1个回答
-1
投票

如果您的数据库服务器重新启动,可能会导致此类问题,请尝试为连接池配置验证查询。

© www.soinside.com 2019 - 2024. All rights reserved.