为什么java会使用IPv4Stack提供不同的DNS结果

时间:2010-02-18 17:27:21

标签: java caching dns

我有以下代码:

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记录。 digping都按预期解析了baz.example.com。如何让java的ipv6堆栈正确解决这个问题?

3 个答案:

答案 0 :(得分:1)

问题是nscd正在运行并缓存了记录。为什么它不尊重TTL以及为什么ping不使用缓存仍然是一个谜。

答案 1 :(得分:0)

嗯,这里有点奇怪的事情。我怀疑它可能与DNS缓存执行的域名查找有关。修改以下属性:

  

java.home / LIB /安全/ java.security

并查看这是否可以解决问题:

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

值为-1(networkaddress.cache的默认值)表示“永远缓存”,这可能导致您在上面看到的内容。

答案 2 :(得分:0)

可能是您的操作系统知道两个不同的DNS服务器,一个可以通过IPv4访问,另一个可以通过IPv6访问和首选,并且IPv6首选DNS服务器仍在缓存旧配置?