我有时会收到以下异常:
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在内部部署-这是由于不同的网络造成的吗?
2条答案
按热度按时间i7uaboj41#
我猜是这样,但我会尝试添加
hibernate.c3p0.max_idle_time=300
,让连接池每隔5分钟回收一次连接。这可以防止连接存活足够长的时间,让其他人(数据库、防火墙等)决定杀死它...4smxwvx52#
请尝试测试在以下时间后是否仍能使用空闲连接:
等等。
最有可能的情况是,您使用某种NAT路由、虚拟(覆盖)网络、负载平衡器等来删除空闲连接,以避免内存不足。
如果您每秒运行许多查询,则连接池对于实现良好的性能非常重要,但是,如果您在许多秒内都不需要连接,则可以执行以下操作之一:
默认的TCP Keep-Alive设置取决于操作系统配置,通常需要启用和设置正确的频率,因为默认频率通常太晚以避免超时。从Java设置这些设置只是最近才变得实用,DB2驱动程序可能还不支持。
请参阅:如何在java或netty中设置套接字选项(TCP_KEEPCNT,TCP_KEEPIDLE,TCP_KEEPINTVL)?
然而,您的应用程序应该为各种问题做好准备,因为:https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing,因此您可能希望添加某种重试逻辑,以处理现在或将来可能出现的任何类型的网络问题。