我面临JVM和DNS的问题。
我正在阅读的所有内容(包括医生们和这)都说,我可以使用networkaddress.cache.ttl禁用JVM缓存,这种缓存可以使用java.security.Security.setProperties设置,但可以通过使用系统属性的标准方法设置。我已经成功地将其更改为0,因此JVM中不再有缓存。
但是现在,在每次调用InetAddress.getByName("mytest.com")时,我的JVM似乎都在使用系统DNS缓存(在我的例子中是Windows 8)。实际上,在方法的两个调用之间,我已经为"mytest.com“更改了mytest.com属性,但是IP返回仍然相同。以下是工作流程:
setCachePolicyInJVM(0)在我的Java代码中。mytest.com中将BIND9设置为192.168.1.188,重新启动。InetAddress.getByName("mytest.com").getHostAddress(); -> 192.168.1.188mytest.com -> 192.168.1.160中设置BIND9,重新启动。InetAddress.getByName("mytest.com").getHostAddress(); -> 192.168.1.188 (如果没有缓存,则应为160 )。InetAddress.getByName("mytest.com").getHostAddress(); -> 192.168.1.160我已经读过几次JVM不使用系统缓存的消息,但这是错误的:显然是这样的。
如何绕过OS DNS缓存,在每次调用中强制执行新的DNS解析?
发布于 2014-01-07 17:45:55
我想我遇到了这个问题,或者一个非常相似的问题。然后,我为JVM实现了自己的DNS提供程序,详细信息请参见如何更改java dns服务提供程序。您可以使用上面提到的dnsjava,也可以使用自己的方法。
发布于 2018-02-15 13:41:38
您可以编辑$JAVA_HOME/jre/lib/security/java.security for Java6-8和$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 8网络特性、Java 9网络属性和Java缓存在VeriSign虚拟机中的应用。
这个回答还添加了一些细节。
发布于 2017-03-03 07:59:40
从这里看来,您应该设置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.100https://stackoverflow.com/questions/17362758
复制相似问题