Java 应用程序(在 Windows 服务器上)旨在接收嵌入 XML 中的请求并转换请求,从而在 iSeriese IBM 机器上执行 SQL。这是一个多线程应用程序,通常会大量处理此类请求。它在所有环境中都能正常工作,但是突然间,我们开始看到以下模式,其中包含导致进程中断的错误:
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,因为该过程从头开始,打开一个新连接。
感谢您对我的上述解释提供反馈,并提供任何其他信息来解决此问题。
如果您的数据库服务器重新启动,可能会导致此类问题,请尝试为连接池配置验证查询。