繁体   English   中英

JVM和OS DNS缓存

[英]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返回仍然是相同的。 这是工作流程:

  1. 我的Java代码中的setCachePolicyInJVM(0)
  2. mytest.com设置为192.168.1。 在BIND9中188 ,重启。
  3. InetAddress.getByName("mytest.com").getHostAddress(); - > 192.168.1。 188
  4. 设置mytest.com - > 192.168.1。 在BIND9 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

我已多次读过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM