在JVM中清理DNS服务器

zer*_*Dev 3 java dns jvm

在我处理DNS的第一篇文章之后,仍未解决:JVM和OS DNS缓存 ,我正面临一个新问题.

首先是我的用例:我想检查我的私有DNS是否还活着.如果不是,我想使用一般DNS(例如8.8.8.8).

我的私有DNS(ubuntu上的bind9与192.168.1.188)作为特定记录:test.testdnd.fr - > 192.168.1.100

所以我想我能做到这一点:

if(InetAddress.getByAddress(my_dns_ip_in_byte).isReachable()){
    System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");
    System.setProperty("sun.net.spi.nameservice.nameservers", 192.168.1.188);
}else{
    System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");
    System.setProperty("sun.net.spi.nameservice.nameservers", "8.8.8.8");
}
 InetAddress.getHostByAddress(test.testdnd.fr) -> unknow host exception
Run Code Online (Sandbox Code Playgroud)

但如果我只做:

System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");
System.setProperty("sun.net.spi.nameservice.nameservers", 192.168.1.188);
InetAddress.getHostByAddress(test.testdnd.fr) -> 192.168.1.100
Run Code Online (Sandbox Code Playgroud)

因此,一旦我在设置system.property之前调用了InetAddress方法,似乎system.property没有任何效果.也许是因为JVM在调用InetAddress方法时加载系统DNS值,即使它不使用DNS解析.

这是JVM中的标准行为还是我失去了什么?

欢迎任何帮助,

小智 6

问题是名称服务提供程序只加载一次InetAddress并缓存以供进一步使用.加载发生在类的静态初始化程序中InetAddress.因此,一旦InetAddress初始化,设置或更改sun.net.spi.nameservice.provider属性将不再有效.