在我第一篇关于DNS的文章中,仍然没有解决:JVM和操作系统DNS缓存,我面临一个新问题。
首先,这是我的用例:我想检查我的私有DNS是否正常运行。如果不是,我想使用通用DNS(例如8.8.8.8)。
我的私有DNS(在Ubuntu上的bind9,IP地址为192.168.1.188)有一个特定的记录:test.testdnd.fr -> 192.168.1.100
所以我认为我可以这样做:
但如果我只做这个:
首先,这是我的用例:我想检查我的私有DNS是否正常运行。如果不是,我想使用通用DNS(例如8.8.8.8)。
我的私有DNS(在Ubuntu上的bind9,IP地址为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
但如果我只做这个:
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
在设置系统属性之前调用InetAddress方法,似乎会导致系统属性无效。可能是因为当调用InetAddress方法时,JVM会加载系统DNS值,即使它不使用DNS解析。
这是JVM的标准行为还是我漏掉了什么?
欢迎任何帮助,
InetAddress.getByAddress(my_dns_ip_in_byte).isReachable()
返回 true 吗?(如果你还没有检查过,应该在 if 块中添加一些调试输出来查看) - frostmatthew