Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql HikariCP不';无法检测数据库DNS更改_Postgresql_Clojure_Amazon Rds_Hikaricp - Fatal编程技术网

Postgresql HikariCP不';无法检测数据库DNS更改

Postgresql HikariCP不';无法检测数据库DNS更改,postgresql,clojure,amazon-rds,hikaricp,Postgresql,Clojure,Amazon Rds,Hikaricp,在我们的应用程序中,我们将HikariCP与Postgres一起使用。应用程序通过CNAME连接到数据库(数据库位于CNAME后面) 将CNAME的值更改为另一个DB(在本例中,副本升级为主数据库)不会反映在连接池中。查询仍然尝试从旧数据库中获取数据。HikariCP仅在maxLifeTime结束或我们重新启动应用程序时进行更改 maxLifeTime设置为30分钟,idleTimeout设置为10分钟(这是HikariCP的默认值) 问题:HikariCP是否有办法在不等待maxLifeTim

在我们的应用程序中,我们将HikariCP与Postgres一起使用。应用程序通过CNAME连接到数据库(数据库位于CNAME后面)

将CNAME的值更改为另一个DB(在本例中,副本升级为主数据库)不会反映在连接池中。查询仍然尝试从旧数据库中获取数据。HikariCP仅在
maxLifeTime
结束或我们重新启动应用程序时进行更改

maxLifeTime
设置为30分钟,
idleTimeout
设置为10分钟(这是HikariCP的默认值)

问题:HikariCP是否有办法在不等待
maxLifeTime
过期的情况下发现连接丢失并从传递的
serverName
重新创建新连接

我尝试的内容:我将
maxLifeTime
设置为2分钟。在最坏的情况下,在建立新连接之前,我的应用程序将关闭2分钟。但在2分钟内,我们指示HikariCP每2分钟建立一次新连接。这是一个好方法吗?我看到有人建议在15-20分钟之间给出一个值,或者在DB连接
maxLifeTime
之前给出一个值

另外,申请表在clojure-1.7、HikariCP-1.7、postgres-9.6上

编辑:为了澄清为什么我将DB放在CNAME后面,是为了创建一个类似于AWS RDS的多AZ环境的设置,如果主DB进行备份,另一个DB将开始为请求提供服务

HikariCP是否有办法查明连接是否丢失,是否需要从传递的serverName重新创建新的连接,而不必等到maxLifeTime过期

更改CNAME时,以前命名的DB(及其连接)仍处于活动状态,对吗?我假设当DNS改变时,连接并没有真正丢失;CNAME只是指向另一个DB副本/实例。HikariCP不会检查DNS记录是否已更改,它只关心连接是否有效

这里有一个想法:您可以在程序轮询中使用其他线程来更改CNAME,并在发生更改时调用池。这将立即关闭所有空闲/可保留的连接,并将所有其他连接标记为退出

或者,如果您正在手动更改CNAME,我想您可以手动插入您的应用程序来执行此操作,而不是从内部进行轮询

如果您想在此期间暂停数据库访问,也可以
suspendPool()
resumePool()

您的答案在这里

简言之,如果JVM将DNS查找缓存较长时间,HikariCP将无能为力。您需要在JVM级别解决这个问题。此外,上游DNS服务器的TTL也将产生重大影响——在本机DNS TTL过期之前也会进行缓存


编辑:对不起,我错过了问题的关键部分。正如Taylor所指出的,您可以挂起池(需要启用
allowPoolSuspension
),软退出连接,然后恢复池。退出时处于“运行中”状态的连接将正常完成,然后在返回池时立即退出。

这并不能解决以前命名的数据库的“过时”连接保持活动的问题:“有没有办法。。。重新创建新的连接。。。不必等到
maxLifeTime
expires?”我刚刚注意到,您正在使用一个非常旧的HikariCP版本。我建议升级到Clojure包装和HikariCP的最新版本。此外,为包com.zaxxer.hikari启用调试级日志记录……您可以观察连接生命周期(创建/退出)的日志@brettw我们计划升级到最新的HikariCP,但这需要一些时间。我已启用调试级别以查看日志,但HikariCP不会重新创建连接池。我认为检查DNS更改不是HikariCP的责任,仍然不知道是否有更干净的方法。@TaylorWood我有一种不同的方法,其中应用程序连接到HAProxy正在运行的端口(在同一实例中),HAProxy服务器正在轮询来自DB的连接。在这种情况下,如果DB发生更改,则我需要重新启动HAProxy服务器(在毫秒内启动).但这仍然需要人为干预。有什么建议吗?@VikashGupta,如果我能提出一个切题的建议……根据我的经验,通过始终保持依赖关系的最新状态来处理依赖关系往往会更容易。如果你有一个良好的QA流程,其中(大部分是自动化的)测试覆盖了整个项目,您将在发布时自动测试合并的更改。如果您让依赖项过期,您最终将面临一个困难而痛苦的升级过程,因为您有多年的更改需要一次全部吸收。用一个比喻来说,对您的汽车进行定期维护比一次更新更容易等待引擎出现故障。我已经创建了一个调度程序,每30秒轮询一次以检查DNS更改……但我担心的是,如果CPU峰值为100%JVM会杀死随机线程以使其稳定,而调度程序线程被杀死,我就回到了原点-(@VikashGupta如果您有多个AZ RDS主机,您可以在将CNAME更新为副本后通过故障切换重新启动主机。这将更改主机RDS的IP地址,并将导致现有池连接失败。此外,您还必须将Postgres驱动程序读取和套接字超时设置为快速失败。HikariCP将创建新连接并连接ect到副本。如果遇到超时问题,请检查此项-