2010-02-18 37 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

相关问题