13

我面临着 JVM 和 DNS 的问题。

我正在阅读的所有内容(包括 docsthis)都说我可以使用 禁用 JVM DNS 缓存networkaddress.cache.ttl,可以使用 设置java.security.Security.setProperties,但是通过使用系统属性的标准方法。我已成功将其更改为 0,因此我的 JVM 中不再有缓存。

但是现在,在每次调用 时InetAddress.getByName("mytest.com"),我的 JVM 似乎都在使用系统DNS 缓存(在我的情况下是 Windows 8)。实际上,在两次调用该方法之间,我更改了“mytest.com”的 BIND9 属性,但 IP 返回仍然相同。这是工作流程:

  1. setCachePolicyInJVM(0)在我的 Java 代码中。
  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 解析?

4

3 回答 3

4

我想我遇到了这个问题,或者一个非常相似的问题。我当时所做的是为 JVM 实现我自己的 DNS 提供程序,有关详细信息,请参阅如何更改 java dns 服务提供程序。您可以使用那里提到的 dnsjava 或自己滚动。

于 2014-01-07T17:45:55.117 回答
1

您可以编辑您的$JAVA_HOME/jre/lib/security/java.securityfor Java 6-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 DNS 缓存

这个答案还增加了一些细节。

于 2018-02-15T13:41:38.513 回答
0

这里看来你应该设置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
于 2017-03-03T07:59:40.573 回答