如何让jdbc保持活力

时间:2014-10-01 13:26:34

标签: java postgresql jdbc timeout

所以我现在已经跟踪了一两天的错误,这个错误发生在我无法控制的远程服务器上。我的代码的细节是,我向我们的UI团队提供了一个jar文件,它包装postgres并为用户导入的数据提供存储空间。由于多种原因,导入过程非常缓慢,其中一个原因是用户正在导入不可预测的大量数据(我们无法真正减少这些数据)。这导致了大量的时间问题。

经过一些初步调查后,我已将其缩小到jdbc到postgres数据库超时。我在本地测试设置中复制这个问题时遇到了很多麻烦,但最终还是通过减少“socketTimeout”来实现这一目标。 10s的连接属性(在连接上每次调用之间超过10秒)。

我现在的问题是,保持这种生命的最佳方法是什么?我已经设置了'tcpKeepAlive'为了真实,但这似乎没有效果,我是否需要手动轮询连接或什么?根据我的阅读,我假设轮询是自动的,并由操作系统控制。如果这是真的,我实际上无法控制运行环境中的操作系统设置,处理此问题的最佳方法是什么?

我正在考虑每次使用它时测试连接,如果它已经超时,我将创建一个新连接。这是正确的行动方案还是有更好的方法来保持连接活着?我刚看了一下这篇帖子,人们建议你应该为每个查询打开和关闭一个连接: When my app loses connection, how should I recover it?

在我的情况下,我有一系列顺序插入发生在一个线程上,如果一个线程失败,它们都会失败。为实现这一点,我使用了交易:

m_Connection.setAutoCommit(false); 
m_TransactionSave = m_Connection.setSavepoint();

// Do something

m_Connection.commit(); 
m_TransactionSave = null; 
m_Connection.setAutoCommit(true);

如果我继续重新连接,或者使用像PGBouncer这样的连接池(就像评论中建议的那样),我该如何在这些连接中保留此交易?

1 个答案:

答案 0 :(得分:3)

可以使用keep-alive设置配置与PostGres的JDBC连接。这里针对此功能提出了一个问题:JDBC keep alive issue。此外,还有parameter help page

从上面的注释中,您可以将以下内容添加到JDBC连接的连接参数中:

tcpKeepAlive=true;

减少socketTimeout应该会让事情变得更糟,而不是更好。 socketTimeout衡量连接在数据到达时应该等待的时间,但事实并非如此。让我更长,更短的是我的直觉。

您是否可以使用PGBouncer?如果没有活动,该进程将主动终止来自服务器端的连接。

最后,如果您在Linux上运行,则可以使用以下命令更改TCP保持活动设置:keep alive settings。我确信Windows存在类似的东西。