首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HikariCP没有检测到DNS的变化

HikariCP没有检测到DNS的变化
EN

Stack Overflow用户
提问于 2018-01-24 11:13:18
回答 2查看 2.5K关注 0票数 4

在我们的应用程序中,我们将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将开始为请求提供服务。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-24 16:26:44

你的答案在这里. 设置用于DNS名称查找的JVM TTL

简而言之,如果JVM缓存DNS查找很长一段时间,HikariCP就无能为力。您需要在JVM级别解决这个问题。此外,上游DNS服务器的TTL也将产生重大影响--还将缓存直到本机DNS TTL过期为止。

编辑:对不起,我漏掉了问题的一个关键部分。正如泰勒所指出的,您可以挂起池(需要启用allowPoolSuspension),软退出连接,然后恢复池。在驱逐时“在逃”的连接将正常完成,然后在返回池时立即被逐出。

票数 2
EN

Stack Overflow用户

发布于 2018-01-24 11:46:15

是否有一种方法可以让HikariCP找出连接是否丢失,并且需要重新创建来自传递的serverName的新连接,而不必等到maxLifeTime到达时才结束?

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

这里有一个想法:您可以在程序轮询中为CNAME更改设置一些其他线程,并在发生更改时在池中调用softEvictConnections()。这将立即关闭任何空闲/可预订的连接,并标记任何其他连接以进行驱逐。

或者,如果您正在手动更改CNAME,我想您可以手动地戳您的应用程序,而不是从内部轮询。

如果您想在发生这种情况时延迟您的DB访问,也可以使用suspendPool()resumePool()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48421107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档