我正在使用postgres 9.1,org.apache.commons.dbcp.BasicDataSource
(对于我的连接池)和Java 1.7。当我重新启动postgres服务器时,我会遇到org.postgresql.util.PSQLException: FATAL: terminating connection due to administrator command
等异常。
如何使连接自动重新连接到重新启动的数据库?
答案 0 :(得分:5)
根据the docs,DBCP有一个连接验证查询选项 - validationQuery
。您可以将其设置为类似SELECT 1;
的内容,DBCP将在返回连接之前运行该测试。
那就是说,你的应用真的应该处理这个案子。 SQL查询可能由于各种原因而失败,您应该始终在具有时间退避和重试限制的重试循环中执行查询,并使用一些逻辑来确定哪些异常在重试时可恢复,哪些不是(使用SQLState)为此)。
特别是,验证受竞争条件的影响,您可以在其中进行如下事件排序:
或
...因此,对于您的应用来说,保持适当的重试循环和良好的事务处理仍然很重要。
您可以从SQLException获取SQLState:SQLException.getSQLState
。 PostgreSQL的代码是in the PostgreSQL manual。
答案 1 :(得分:3)
在这种特殊情况下,PostgreSQL连接告诉您在创建连接后服务器已关闭。 DBCP连接池无法使用默认配置处理此条件。
即使您将 validationQuery 参数设置为 SELECT 1 之类的内容,也不会使用它,除非您还设置了至少一个 testOnXXXX 参数。
我通常会将 testOnCreate 和 testOnBorrow 设置为 true 。
另请检查DBCP的其他默认值(在org.apache.commons.pool2.impl.BaseObjectPoolConfig中),因为在我看来它们不适合生产环境。