[英]JVM and OS DNS Caching
我正面临着JVM和DNS的问题。
一切我读(包括该文档和本 )说,我可以通过禁用JVM DNS缓存networkaddress.cache.ttl
,它可以使用设置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。 在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 )。 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.