2010-02-18 60 views
2

我有以下代碼:爲什麼java的給不同的DNS結果與IPv4Stack

import java.net.InetAddress; 

public class lookup { 

    public static void main(String[] args) throws Exception { 
    for(String host : args){ 
     for(InetAddress addr : InetAddress.getAllByName(host)){ 
     System.out.println(addr.getHostAddress()); 
    } 
    } 
} 
} 

我們最近改變了對CNAME我們會打電話給主機foo.example.com從bar.example.com指向指向baz.example.com。如果我運行:

java -Djava.net.preferIPv4Stack=true lookup foo.example.com 

我得到baz.example.com的IP地址,如預期的那樣。但是,如果我運行:

java lookup foo.example.com 

我仍然得到bar.example.com的IP地址。

我確認bar.example.com和baz.example.com都沒有AAAA記錄。 和ping都按預期方式解析baz.example.com。我如何獲得java的ipv6堆棧來正確解決這個問題?

+0

更新:在切換回DNS後,我發現IPv4棧仍然解析爲baz.example.com,IPv6棧解析bar.example.com,所以這似乎是某種緩存問題。 – Stuart 2010-02-18 19:29:51

回答

1

問題是nscd正在運行並緩存了記錄。爲什麼它不尊重TTL以及爲什麼ping不使用緩存仍然是一個謎。

0

嗯,這裏有一些奇怪的事情發生在這裏。我懷疑它可能與DNS緩存域名查詢執行有關。在修改以下屬性:

java.home/lib/security中/ java.security

,看看能否解決問題:

networkaddress.cache.ttl: 10 
networkaddress.cache.negative.ttl: 10 

值爲-1( networkaddress.cache的默認值)表示「永遠緩存」,這可能會導致您在上面看到的內容。

+0

我已經將這兩個值都設置爲10,問題仍然存在。無論如何,當我啓動一個新的jvm時,我認爲緩存將被清除。 – Stuart 2010-02-18 17:40:52

0

請問您的操作系統是否知道兩臺不同的DNS服務器,一臺可以通過IPv4訪問,另一臺可以通過IPv6訪問,首選的IPv6服務器仍舊緩存舊配置?

+0

我不確定如何測試。 'dig -6 foo.example.com'說'dig:add_nameserver failed' – Stuart 2010-02-18 18:26:18

相關問題