[英]Reconnecting to a postgres database after postgres restart from Java
我正在使用postgres 9.1, org.apache.commons.dbcp.BasicDataSource
(用于我的连接池)和Java 1.7。 当我重新启动postgres服务器时,我得到了像org.postgresql.util.PSQLException: FATAL: terminating connection due to administrator command
这样的异常org.postgresql.util.PSQLException: FATAL: terminating connection due to administrator command
。
如何使连接自动重新连接到重新启动的数据库?
根据文档 ,DBCP有一个连接验证查询选项 - validationQuery
。 您可以将其设置为SELECT 1;
并且DBCP将在返回连接之前运行该测试。
也就是说,你的应用真的应该处理这种情况。 SQL查询可能由于各种原因而失败,您应该始终在具有时间退避和重试限制的重试循环中执行查询,并使用一些逻辑来确定哪些异常在重试时可恢复,哪些不是(使用SQLState)为了那个原因)。
特别是,验证受竞争条件的影响,您可以在其中进行以下事件排序:
要么
...因此,对于您的应用来说,保持适当的重试循环和良好的事务处理仍然很重要。
您可以从SQLException获取SQLState: SQLException.getSQLState
。 PostgreSQL的代码在PostgreSQL手册中 。
在这种特殊情况下,PostgreSQL连接告诉您在创建连接后服务器已关闭。 DBCP连接池无法使用默认配置处理此情况。
即使您将validationQuery参数设置为SELECT 1之类的东西,也不会使用它,除非您还设置了至少一个testOnXXXX参数。
我通常将testOnCreate和testOnBorrow都设置为true 。
还要检查DBCP的其他默认值(在org.apache.commons.pool2.impl.BaseObjectPoolConfig中),因为在我看来它们不适合生产环境。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.