And*_*ndy 3 java postgresql timeout jdbc
所以我一直在跟踪一个错误一两天,它发生在我几乎无法控制的远程服务器上。我的代码的来龙去脉是,我向我们的 UI 团队提供了一个 jar 文件,它包装了 postgres 并为用户导入的数据提供存储。由于多种原因,导入过程非常缓慢,其中之一是用户正在导入不可预测的大量数据(我们无法真正减少)。这导致了大量的超时问题。
经过一些初步调查,我将范围缩小到 jdbc 到 postgres 数据库超时。我在本地测试设置中复制此设置时遇到了很多麻烦,但最终通过将连接属性的“socketTimeout”减少到 10 秒(在连接上进行的每次调用之间的时间超过 10 秒)成功解决了这个问题。
我现在的问题是,保持这种活力的最佳方法是什么?我已经将 'tcpKeepAlive' 设置为 true,但这似乎没有效果,我是否需要手动轮询连接或其他什么?根据我的阅读,我假设轮询是自动的,并由操作系统控制。如果这是真的,我真的无法控制运行环境中的操作系统设置,处理这个问题的最佳方法是什么?
我正在考虑在每次使用时测试连接,如果它超时,我将创建一个新连接。这是正确的做法还是有更好的方法来保持连接活跃?我刚刚看了这篇文章,人们建议你应该打开和关闭每个查询的连接: 当我的应用程序丢失连接时,我应该如何恢复它?
在我的情况下,我有一系列顺序插入发生在单个线程上,如果单个插入失败,它们都会失败。为了实现这一点,我使用了交易:
m_Connection.setAutoCommit(false);
m_TransactionSave = m_Connection.setSavepoint();
// Do something
m_Connection.commit();
m_TransactionSave = null;
m_Connection.setAutoCommit(true);
Run Code Online (Sandbox Code Playgroud)
如果我继续重新连接,或者使用像 PGBouncer 这样的连接池(就像有人在评论中建议的那样),我如何在它们之间保持这个事务?
可以使用保持活动设置来配置与 PostGres 的 JDBC 连接。此处针对此功能提出了一个问题:JDBC keep alive issue。此外,还有参数帮助页面。
根据有关说明,您可以将以下内容添加到 JDBC 连接的连接参数中:
tcpKeepAlive=true;
Run Code Online (Sandbox Code Playgroud)
减少 socketTimeout 应该会让事情变得更糟,而不是更好。socketTimeout 衡量连接在预期数据到达时应等待多长时间,但事实并非如此。让它更长,而不是更短是我的本能。
您是否可能正在使用PGBouncer?如果没有活动,该进程将主动终止来自服务器端的连接。
最后,如果您在 Linux 上运行,您可以使用以下命令更改 TCP 保持活动设置:keep alive settings。我确信 Windows 存在类似的东西。