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

时间:2013-06-04 19:36:33

标签: java postgresql jdbc apache-commons-dbcp

我正在使用postgres 9.1,org.apache.commons.dbcp.BasicDataSource(对于我的连接池)和Java 1.7。当我重新启动postgres服务器时,我会遇到org.postgresql.util.PSQLException: FATAL: terminating connection due to administrator command等异常。

如何使连接自动重新连接到重新启动的数据库?

2 个答案:

答案 0 :(得分:5)

根据the docs,DBCP有一个连接验证查询选项 - validationQuery。您可以将其设置为类似SELECT 1;的内容,DBCP将在返回连接之前运行该测试。

那就是说,你的应用真的应该处理这个案子。 SQL查询可能由于各种原因而失败,您应该始终在具有时间退避和重试限制的重试循环中执行查询,并使用一些逻辑来确定哪些异常在重试时可恢复,哪些不是(使用SQLState)为此)。

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

  1. 验证
  2. 传递与应用的连接
  3. 服务器关闭
  4. App运行第一个声明
    1. 验证
    2. 传递与应用的连接
    3. App运行第一个语句,打开一个事务
    4. 服务器关闭
    5. App运行第二个声明
    6. ...因此,对于您的应用来说,保持适当的重试循环和良好的事务处理仍然很重要。

      您可以从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中),因为在我看来它们不适合生产环境。