在我们的应用程序中,我们将HikariCP与Postgres结合使用。应用程序通过CNAME连接到DB ( DB位于CNAME之后)。
将CNAME的值更改为不同的DB (在本例中,副本被提升为主数据库)没有反映在我们的连接池中。查询仍然试图从旧数据库中获取数据。HikariCP只在maxLifeTime结束或重新启动应用程序时才进行更改。
maxLifeTime设置为30分钟,idleTimeout设置为10分钟(这是HikariCP的默认值)。
问题:是否有一种方法可以让HikariCP发现连接丢失,并在不等待maxLifeTime过期的情况下从传递的serverName重新创建新的连接?
我已经尝试过了:,我把maxLifeTime做了2分钟。在最坏的情况下,我的应用程序将关闭2分钟,直到建立新的连接。但是,2分钟后,我们指示HikariCP每2分钟进行一次新的连接。这样做好吗?我看到有人建议给出一个值,一些在15-20分钟之间,或者一些值低于DB连接maxLifeTime。
P.S.应用程序为clojure-1.7、HikariCP-1.7、postgres-9.6
编辑:要澄清为什么我要把DB放在CNAME后面,就是创建一个类似于AWS RDS的设置,在多个AZ环境中,如果主DB进行备份,另一个DB将开始为请求提供服务。
发布于 2018-01-24 16:26:44
你的答案在这里. 设置用于DNS名称查找的JVM TTL。
简而言之,如果JVM缓存DNS查找很长一段时间,HikariCP就无能为力。您需要在JVM级别解决这个问题。此外,上游DNS服务器的TTL也将产生重大影响--还将缓存直到本机DNS TTL过期为止。
编辑:对不起,我漏掉了问题的一个关键部分。正如泰勒所指出的,您可以挂起池(需要启用allowPoolSuspension),软退出连接,然后恢复池。在驱逐时“在逃”的连接将正常完成,然后在返回池时立即被逐出。
发布于 2018-01-24 11:46:15
是否有一种方法可以让HikariCP找出连接是否丢失,并且需要重新创建来自传递的serverName的新连接,而不必等到maxLifeTime到达时才结束?
当您更改CNAME时,以前命名的DB (以及到它的连接)仍然有效,对吗?我假设当DNS更改时,连接并没有真正丢失;CNAME只是指向一个不同的DB副本/实例。HikariCP不检查DNS记录是否已更改,它只关心连接是否有效。
这里有一个想法:您可以在程序轮询中为CNAME更改设置一些其他线程,并在发生更改时在池中调用softEvictConnections()。这将立即关闭任何空闲/可预订的连接,并标记任何其他连接以进行驱逐。
或者,如果您正在手动更改CNAME,我想您可以手动地戳您的应用程序,而不是从内部轮询。
如果您想在发生这种情况时延迟您的DB访问,也可以使用suspendPool()和resumePool()。
https://stackoverflow.com/questions/48421107
复制相似问题