java(jdbc)如何处理浮动IP?

java(jdbc)如何处理浮动IP?,java,postgresql,networking,jdbc,Java,Postgresql,Networking,Jdbc,我想使用浮动ip访问postgresql数据库(带故障切换)。 我现在有一个小型Web服务连接到数据库并对其运行查询(SELECT now();)。只要在没有postgres客户端等待响应的情况下更改了IP,这似乎工作得很好。 我将查询修改为SELECT NOW(),pg_sleep(1)。现在我在切换IP时遇到了大麻烦。服务停止运行。它不会抛出任何异常或对任何请求作出反应 您可以在本地找到创建两个虚拟主机的代码,首先需要puppet模块安装puppetlabs-postgresqlvagran

我想使用浮动ip访问postgresql数据库(带故障切换)。 我现在有一个小型Web服务连接到数据库并对其运行查询(
SELECT now();
)。只要在没有postgres客户端等待响应的情况下更改了IP,这似乎工作得很好。
我将查询修改为
SELECT NOW(),pg_sleep(1)
。现在我在切换IP时遇到了大麻烦。服务停止运行。它不会抛出任何异常或对任何请求作出反应

您可以在本地找到创建两个虚拟主机的代码,首先需要
puppet模块安装puppetlabs-postgresql
vagrant up
启动两台postgres服务器(
192.168.162.101/102
),您可以使用
switch.sh
切换IP
192.168.162.100

Java能处理交换IP吗?
我该怎么做才能使我的应用程序不停止?

我是否尝试做一些完全愚蠢的事情?

如果在IP切换时有一个打开的TCP/IP请求,PgJDBC将永远不会得到回复,因此它会一直被阻止在套接字上侦听。就好像远程服务器失去了互联网连接,崩溃了,等等

为了解决这个问题,你需要客户端的短时间保存。在
postgresql.conf
或通过
SET
指令配置的服务器端keepalives将不适用于此,因为它们的设计目的是让服务器摆脱死机的客户端连接

PostgreSQL+PgJDBC的原则与任何其他具有有状态长寿命TCP连接的服务的原则相同

对于PgJDBC,要启用keepalives,您需要JDBC连接字符串的
tcpKeepAlive
指令。我认为PgJDBC总是使用Java JVM keepalive默认值,因此您可能需要设置一些JVM参数来调整keepalive间隔,并缩短超时时间


对于大多数用途,将PgBouncer实例作为连接代理就足够了。这将被重新配置为在故障转移时指向新的主设备。这确实意味着有一个单一的失败点,但这是一个几乎无状态和简单的一个。与使用基于IP的故障切换玩游戏相比,PgBouncer造成问题的可能性要小得多。

答案是Java什么都不做。它只是和其他人一样依赖于相同的DNS API。