JVM和OS DNS缓存

我正面临着JVM和DNS的问题。

我正在阅读的所有内容(包括文档和本文 )都说我可以使用networkaddress.cache.ttl禁用JVM DNS缓存,可以使用java.security.Security.setProperties设置,但是通过使用系统属性的标准方法。 我已成功将其更改为0,因此我的JVM中不再有缓存。

但现在,在每次调用InetAddress.getByName("mytest.com") ,似乎我的JVM正在使用系统 DNS缓存(在我的情况下是Windows 8)。 实际上,在该方法的两次调用之间,我已经更改了“mytest.com”的BIND9属性,但IP返回仍然是相同的。 这是工作流程:

  1. 我的Java代码中的setCachePolicyInJVM(0)
  2. mytest.com设置为192.168.1。 在BIND9中188 ,重启。
  3. InetAddress.getByName("mytest.com").getHostAddress(); – > 192.168.1。 188
  4. 设置mytest.com – > 192.168.1。 在BIND9 160 ,重启。
  5. InetAddress.getByName("mytest.com").getHostAddress(); – > 192.168.1。 188 (如果没有缓存,则应为160 )。
  6. 刷新Windows DNS
  7. InetAddress.getByName("mytest.com").getHostAddress(); – > 192.168.1。 160

我已多次读过JVM不使用系统缓存,但这是错误的:它显然是这样。

我们如何绕过操作系统 DNS缓存强制每次调用新的DNS解析?

我想我遇到过这个问题,或者是一个非常类似的问题。 我当时做的是为JVM实现我自己的DNS提供程序,请参阅如何更改java dns服务提供程序以获取详细信息。 您可以使用那里提到的dnsjava或自己滚动。

您可以编辑Java 6-8的$JAVA_HOME/jre/lib/security/java.security$JAVA_HOME/conf/security/java.security属性文件以添加以下属性。

 networkaddress.cache.ttl=1 

无法在命令行中设置它。

由于这两个属性是安全策略的一部分,因此它们不是由-D选项或System.setProperty()API设置的,而是设置为安全属性。

要在代码中设置此属性,可以使用以下方法。

 java.security.Security.setProperty("networkaddress.cache.ttl", "1") 

或者在java命令行中添加以下属性。

 -Dnetworkaddress.cache.ttl=1 

同样重要的是要注意,仅当未设置相应的networkaddress.cache.*属性时,值才有效。

有关更多详细信息,请参阅Java 虚拟机中的 Java 8网络属性 , Java 9网络属性和VeriSign DNS缓存 。

这个答案也增加了一些细节。

从这里看来你应该设置sun.net.inetaddr.ttl 。 这对我有用。

链接示例:

 java -Dsun.net.inetaddr.ttl=1 test Enter the hostname rrr Output isrrr/129.145.146.100 Enter the hostname rrr Output isrrr/129.147.146.100