15 October 2013

最近在测试Postgres-XC,为了让客户端能够将连接分布到多个pgxc的coordinator上,我们使用DNS轮训的方式解析pgxc的域名。

今天发现是用JDBC在多线程访问pgxc时,dns轮训不起作用,貌似java对dns结果做了缓存。最终定位发现,java确实对dns有缓存机制,可以通过networkaddress.cache.ttl这个参数进行控制。这个参数的单位为秒,具体含义是:

  • 设置为-1,表示缓存永远有效
  • 设置为0,表示不使用缓存
  • 设置为n>0,表示缓存有效期为n秒


默认为永远有效。于此对应的,还有一个dns解析失败的缓存networkaddress.cache.negative.ttl。

设置方法有三种:

方法一:

在${JAVA_HOME}\lib\security\java.security中配置:

networkaddress.cache.ttl=value


方法二:

在jvm启动参数中设置-Dsun.net.inetaddr.ttl=value


方法三:

在代码里设置java.security.Security.setProperty(”networkaddress.cache.ttl” , “value”)