Docker 和 Kubernetes 中的专用 OJDBC 连接

问题描述

我正在运行简单的原生 Java 8 代码生成线程数。这些线程通过它们自己的专用 OJDBC 连接连接到数据库。由于数据库不断填充记录,因此您的线程使用此专用连接来执行数据库中的各种任务。每个线程在一段时间后轮询数据库获取记录然后对其进行处理,然后重新轮询数据库。连接在线程的生命周期内保持不变。 如果我在简单的 VM 上运行它,整个设置工作正常。没有连接关闭,但是一旦我将此 java 代码移动到 Kubernetes 问题就开始出现。 几次后,每个线程开始抛出以下异常

java.sql.sqlRecoverableException: Closed Connection
        at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:3694)

没有重新启动 JDBC 连接,因为线程假定连接是专用的,我们的后端系统不会关闭连接。 此连接关闭仅在 Kubernetes 中随机发生,所以我很好奇是否需要进行任何特定的网络设置才能使专用连接在 Kubernetes 中工作?

解决方法

从评论中得到回应,您可能想要打开 TCP keepalives,但如果这是不可能的,请查看 net.netfilter.nf_conntrack_tcp_timeout_established sysctl 和类似的 conntrack 设置。您也可以使用无头模式服务绕过代理网格,尽管这可能会影响您的故障转移过程,因此请务必仔细检查。