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返回仍然是相同的。 这是工作流程:
- 我的Java代码中的
setCachePolicyInJVM(0)
。 - 将
mytest.com
设置为192.168.1。 在BIND9中188 ,重启。 -
InetAddress.getByName("mytest.com").getHostAddress();
– > 192.168.1。 188 - 设置
mytest.com
– > 192.168.1。 在BIND9 160 ,重启。 -
InetAddress.getByName("mytest.com").getHostAddress();
– > 192.168.1。 188 (如果没有缓存,则应为160 )。 - 刷新Windows DNS
-
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