【发布时间】:2013-06-26 02:41:14
【问题描述】:
我遇到了 JVM 和 DNS 的问题。
我正在阅读的所有内容(包括the docs 和this)都说我可以使用networkaddress.cache.ttl 禁用JVM DNS 缓存,可以使用java.security.Security.setProperties 进行设置,但是通过使用系统属性的标准方法。我已成功将其更改为 0,因此我的 JVM 中不再有缓存。
但是现在,在每次调用 InetAddress.getByName("mytest.com") 时,我的 JVM 似乎都在使用 system DNS 缓存(在我的情况下是 Windows 8)。实际上,在两次调用该方法之间,我更改了“mytest.com”的 BIND9 属性,但 IP 返回仍然相同。这是工作流程:
-
setCachePolicyInJVM(0)在我的 Java 代码中。 - 在 BIND9 中将
mytest.com设置为 192.168.1。188,重新启动。 -
InetAddress.getByName("mytest.com").getHostAddress();-> 192.168.1.188 - 在 BIND9 中设置
mytest.com-> 192.168.1.160,重启。 -
InetAddress.getByName("mytest.com").getHostAddress();-> 192.168.1.188(如果没有缓存,应该是 160)。 - 刷新 Windows DNS
-
InetAddress.getByName("mytest.com").getHostAddress();-> 192.168.1.160
我读过几次,JVM 不使用系统缓存,但这是错误的:它显然是这样做的。
我们如何绕过 OS DNS 缓存,在每次调用时强制执行新的 DNS 解析?
【问题讨论】:
-
这对我也很有用:我正在尝试禁用 JVM DNS 缓存,以便在故障转移场景期间使用负载均衡器另一端的所有 IP 地址。由于我们处于故障转移场景,我无法提前知道新的 IP 地址,也不清楚新的 IP 地址何时上线。所以我真的需要每次都进行 DNS 查找。