【问题标题】:The bean encountered a non-application exception; nested exception is: org.hibernate.exception.JDBCConnectionException: could not execute querybean 遇到非应用程序异常;嵌套异常是:org.hibernate.exception.JDBCConnectionException:无法执行查询
【发布时间】:2021-07-16 10:33:25
【问题描述】:

我有时会遇到以下异常:

ERROR : 07.16.2021:0709 (05.988) [[]http-nio-8080-exec-4] ShippingSatelliteForm: /addLeadTimeForShippingBakeries.xhtml, user - The bean encountered a non-application exception; nested exception is: ERROR : 07.16.2021:0709 (05.988) [[]http-nio-8080-exec-4] ShippingSatelliteForm: /addLeadTimeForShippingBakeries.xhtml, user - The bean encountered a non-application exception; nested exception is:  org.hibernate.exception.JDBCConnectionException: could not execute query 

Caused by: com.ibm.db2.jcc.am.DisconnectNonTransientConnectionException: [jcc][t4][2030][11211][4.21.29] A communication error occurred during operations on the connection's underlying socket, socket input stream,  Caused by: com.ibm.db2.jcc.am.DisconnectNonTransientConnectionException: [jcc][t4][2030][11211][4.21.29] A communication error occurred during operations on the connection's underlying socket, socket input stream, or socket output stream.  Error location: Reply.fill() - insufficient data (-1).  Message: Insufficient data. ERRORCODE=-4499, SQLSTATE=08001

我已经在 Azure Kubernetes 中部署了应用程序,而 DB2 在本地 - 这是由于不同的网络而发生的吗?

【问题讨论】:

  • 您的站点需要进行一些调查。在此异常之前检查一次 Db2 服务器诊断。检查 HA 配置详细信息。找一些熟练的问题确定人员来检查配置和诊断。这不是编程,这是故障排除。
  • 正如@mao 已经说过的,这可能是网络/配置问题。你应该检查这个 stackoverflow question 和这个 IBM FAQ 页面。
  • 我正在与网络和 DB2 团队合作,我们找不到任何网络问题,@mao。我们认为这是一个应用问题,需要解决。让我知道需要哪些详细信息?
  • 什么是HA配置?为什么使用 db2jcc4.jar 的 GA 版本(而不是 4.25.25 版本)?什么是 Db2 服务器平台(z/os、i 系列、linux/unix/windows)?什么是 Db2 服务器版本? Db2 服务器上的哪些事件与在客户端看到的症状的时间戳相关?
  • 您能否向我们展示您的数据源属性(当然是匿名的)。 driver-class-name 和 jdbc-url。

标签: java db2 azure-aks


【解决方案1】:

在这里猜测,但我会尝试添加 hibernate.c3p0.max_idle_time=300 以使连接池每 5 分钟回收一次连接。这可以防止连接存在足够长的时间让其他人(数据库、防火墙等)决定终止它...

【讨论】:

    【解决方案2】:

    尝试测试您是否仍然可以使用空闲连接:

    • 15 秒
    • 30 秒
    • 60 秒

    等等

    您很可能使用某种 NAT 路由、虚拟(覆盖)网络、负载平衡器等来删除空闲连接以避免内存不足。

    如果您每秒运行许多查询,连接池对于实现良好性能很重要,但如果您在几秒钟内不需要连接,您也可以:

    • 关闭连接
    • 重新测试是否仍然有效
    • 配置 TCP Keep-Alive(在服务器或客户端)

    默认 TCP Keep-Alive 设置取决于操作系统配置,并且通常需要启用和设置正确的频率,因为默认频率通常太晚以避免超时。从 Java 设置这些只是最近才变得实用,可能尚未得到 DB2 驱动程序的支持。

    见:How to set socket option (TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL) in java or netty?

    但是,您的应用程序应该为各种问题做好准备,因为:https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing,因此您可能需要添加某种重试逻辑来处理现在或将来可能出现的任何类型的网络问题。

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 2019-10-11
      • 2021-09-06
      • 2019-03-15
      • 2022-10-24
      • 2016-08-05
      • 2010-11-22
      • 1970-01-01
      • 2019-11-28
      相关资源
      最近更新 更多