2013-07-02 79 views
3

我的第一篇文章處理DNS後仍未解決:JVM and OS DNS Caching ,我正面臨一個新問題。JVM中的乾淨的DNS服務器

首先這裏是我的用例:我想檢查我的私人DNS是否還活着。如果不是,我想使用一般的DNS(例如8.8.8.8)。

我的私人DNS(與192.168.1.188 Ubuntu的一個BIND9)作爲一個特定的記錄: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 

所以只要我叫設定system.property前一個InetAddress方法,似乎system.property沒有效果。也許是因爲JVM在調用InetAddress方法時加載系統DNS值,即使它不使用DNS解析。

這是JVM中的標準行爲還是我失去了一些東西?

任何幫助是值得歡迎的,

+0

[設置DNS屬性沒有任何作用]的可能的重複(http://stackoverflow.com/questions/11957221/setting-dns-property-not-having-any-effect) – Exupery

+0

它不是真的重複,我想要使用私人DNS服務器。 – zeraDev

+0

你確定'InetAddress.getByAddress(my_dns_ip_in_byte).isReachable()'返回true嗎? (如果你還沒有檢查過,你應該添加一些調試輸出到if塊來看) – Exupery

回答

0

的JVM只使用您對未使用系統的默認查找設置DNS提供商。您可以將文檔(http://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html),相關的摘錄中看到這一點:

默認情況下,Java將使用系統配置的名稱查找 機制

您可以指定IP的一個逗號分隔的地址列表點要使用

在JDK 7,供應商是鏈接,這意味着如果一個 查找上提供者失敗,在列表中的下一個提供商諮詢 解析名稱的DNS服務器。

+0

是的,但在我的情況下,我嘗試解決私人記錄(不存在於公共DNS中)。所以通常JVM應該嘗試使用下一個提供者(我的私人DNS),但是如果我在設置屬性之前調用網絡方法,則不會。 – zeraDev

6

問題是名稱服務提供程序僅在InetAddress中加載一次,並被緩存以供進一步使用。加載發生在類InetAddress的靜態初始化程序中。因此,一旦初始化InetAddress,設置或更改sun.net.spi.nameservice.provider屬性將不起作用。

+0

感謝您的解釋。 – zeraDev