繁体   English   中英

postgres从Java重启后重新连接到postgres数据库

[英]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)为了那个原因)。

特别是,验证受竞争条件的影响,您可以在其中进行以下事件排序:

  1. 验证
  2. 传递给app的连接
  3. 服务器关闭
  4. App运行第一个声明

要么

  1. 验证
  2. 传递给app的连接
  3. App运行第一个语句,打开一个事务
  4. 服务器关闭
  5. App运行第二个声明

...因此,对于您的应用来说,保持适当的重试循环和良好的事务处理仍然很重要。

您可以从SQLException获取SQLState: SQLException.getSQLState PostgreSQL的代码在PostgreSQL手册中

在这种特殊情况下,PostgreSQL连接告诉您在创建连接后服务器已关闭。 DBCP连接池无法使用默认配置处理此情况。

即使您将validationQuery参数设置为SELECT 1之类的东西,也不会使用它,除非您还设置了至少一个testOnXXXX参数。

我通常将testOnCreatetestOnBorrow都设置为true

还要检查DBCP的其他默认值(在org.apache.commons.pool2.impl.BaseObjectPoolConfig中),因为在我看来它们不适合生产环境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM