我遇到了JVM和DNS的问题。
我正在阅读的所有内容(包括the docs和this)表示我可以使用networkaddress.cache.ttl
禁用JVM DNS缓存,可以使用java.security.Security.setProperties
设置,但是使用系统属性的标准方法。我已成功将其更改为0,因此我的JVM中不再有缓存。
但现在,在InetAddress.getByName("mytest.com")
的每次调用中,似乎我的JVM正在使用系统 DNS缓存(在我的情况下是Windows 8)。实际上,在方法的两次调用之间,我已经更改了“mytest.com”的BIND9属性,但IP返回仍然是相同的。这是工作流程:
setCachePolicyInJVM(0)
。mytest.com
设置为192.168.1。 188 ,重启。InetAddress.getByName("mytest.com").getHostAddress();
- > 192.168.1。 188 mytest.com
- > BIND9中的192.168.1。 160 ,重启。InetAddress.getByName("mytest.com").getHostAddress();
- > 192.168.1。 188 (如果没有缓存,则应 160 )。InetAddress.getByName("mytest.com").getHostAddress();
- > 192.168.1。 160 我已经多次读过JVM没有使用系统缓存,但这是错误的:它显然是这样。
我们如何绕过操作系统 DNS缓存强制每次调用新的DNS解析?
答案 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 Properties,Java 9 Networking Properties和VeriSign 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