我有两台Linux服务器(AB),安装了PostgreSQL 9.5数据库.我按照documentation中的描述配置了hot standby模式.在此设置中,A配置为主机,B配置为热备用模式.这项技术运行良好,性能符合预期.

现在,我想通过TomEE数据源通过Hibernate/JDBC将一个独立的Java EE应用程序(在另一台机器上运行)连接到这个数据库设置.

PostgreSQL driver个文档指出,可以在jdbc连接url中指定多个主机:

jdbc:postgresql://host1:port1,host2:port2/database

所以我的问题是:

  1. 如果A关闭,B手动切换到正常操作模式,我的应用程序是否仍然能够使用上述jdbc连接url继续进行数据库操作?
  2. 我必须配置其他参数/库吗?

注意:我从各种渠道了解到,PostgreSQL不支持自动故障切换(除非过程中涉及第三方软件——请参阅下面的注释).因此,故障切换需要手动执行,这对于这个特定的用例来说是可以的.

EDIT-1:

我决定测试pgBouncer(正如 comments 中所建议的)作为解决办法.它在我的用例中运行良好.我写了一个看门狗脚本,自动执行手动步骤:

  1. 继续判断A是否仍处于活动状态,并侦听传入的连接.
  2. 在故障转移的情况下,将B切换到正常操作模式,让它成为新的主设备并重新启动服务.
  3. pgBouncer设置更改为指向B而不是A,然后重新启动服务.

然而,如果有人没有第三方软件的经验,我仍然很感兴趣?

推荐答案

在这种情况下,最好进行测试和测量.

我没有PostrgeSQL热备用模式的"实践"经验,但我已经为Java应用程序完成了数据库故障转移.

首先,在PostgreSQL driver文档页面上测试这些声明

数据源由TomEE中的数据库连接池支持.This page列出了TomEE中可用的内容.

不幸的是,HikariCP使用JDBC的get/setNetworkTimeout来预测行为

(*)更新:由于版本42.2.x,网络超时为implemented.

要执行的第二个测试涉及更新Java"PgHsm"类,以使用您 Select 的数据库连接池实现

  • 将尽快从池中删除无效连接,以便应用程序从池中获得大部分有效连接
  • 数据库关闭时,尽可能少的应用程序线程挂起(时间最短)

第二个测试依赖于服务器A不可用,因此连接测试查询(由数据库连接池执行)失败.

  • suspendPool()
  • 软连接()
  • 等待activeConnections变为0.
  • 简历库()

第三个测试将是JavaEE应用程序,到现在为止,您应该已经对预期的问题有了很好的了解.

Postgresql相关问答推荐

转换失败:(—122.763091,49.04676)转换为地理(位置)""

使用函数返回值作为另一个函数的参数

可以向判断枚举值的SQL列添加约束吗?

supabase 中的交易

右连接 postgresql 出现语法错误

Postgres 函数 now() 返回不正确的时区偏移量

postgres hierarchy - 用祖先的值填充缺失值

配置:错误:C 编译器无法在 Ubuntu 中创建可执行文件

带有附加组的时间刻度 interpolated_average

为什么在 PostgreSQL 中忽略查询超时?

在 PostgreSQL 中返回插入的行

冲突中的 Postgres 会更新复合主键

需要将整个 postgreSQL 数据库加载到 RAM 中

Docker Compose + Spring Boot + Postgres 连接

如何在 PostgreSQL 触发器函数中获取表名?

Select 空字段

postgresql 分组和内部连接

错误:prepared statement "S_1" already exists

判断 PostgreSQL 中的角色是否设置了密码

如何在不丢失openproject数据的情况下将postgresql数据库从10升级到12