JVM和OS DNS缓存

时间:2013-06-28 10:36:56

标签: java caching dns jvm

我遇到了JVM和DNS的问题。

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

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

    我的Java代码中的
  1. setCachePolicyInJVM(0)
  2. 在BIND9中将mytest.com设置为192.168.1。 188 ,重启。
  3. InetAddress.getByName("mytest.com").getHostAddress(); - > 192.168.1。 188
  4. 设置mytest.com - > BIND9中的192.168.1。 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
  8. 我已经多次读过JVM没有使用系统缓存,但这是错误的:它显然是这样。

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

3 个答案:

答案 0 :(得分:3)

我想我遇到过这个问题,或者是一个非常类似的问题。我当时所做的是为JVM实现我自己的DNS提供程序,有关详细信息,请参阅how to change the java dns service provider。您可以使用那里提到的dnsjava或自己动手。

答案 1 :(得分:3)

您可以编辑{6}的pause$JAVA_HOME/jre/lib/security/java.security属性文件,以添加以下属性。

$JAVA_HOME/conf/security/java.security

无法在命令行中设置它。

  

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

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

networkaddress.cache.ttl=1

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

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

同样重要的是要注意,仅当未设置相应的-Dnetworkaddress.cache.ttl=1 属性时,值才有效。

有关详细信息,请参阅Java 8 Networking PropertiesJava 9 Networking PropertiesVeriSign DNS Caching in Java Virtual Machines

answer还会添加一些细节。

答案 2 :(得分:0)

here开始,您似乎应该设置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