Java JVM DNS cache forever issue

由於最近做資料交換的Partner通知要換IP,而我們是用domain的方式連到Partner,所以預期在我們這端是沒有action item的(從firewall出去的部份是沒有特別設限的),但就在Partner換了IP之後我們對Partner的http連線就得到connection timed out的錯誤.

與我們家網管做了些測試,發現若直接用IP連,能在我們家firewall看到封包進出,但若用domain則看不到.因此需要驗證是否問題出現名稱解析上,所以就將Partner的domain ip對應直按寫在/etc/hosts1上,再以domain做http連線測試,但firewall上仍然看不到.最後將application reboot後發現問題解決了.後來得知JVM預設DNS cache forever,也就是一但查過成功的紀錄,永遠不會過期,所以即使對方換IP且DNS設定也己生效,在JVM上還是永遠會使用cache中舊的紀錄來連線.

後來我們以縮短JVM cache的時間來避免未來發生類似問題,可參考如下說明,基本上就是修改java.security檔的networkaddress.cache.ttl設定,由-1 (cache forever)改成60 (秒)在reboot application即可.

Java version:1.5.0_15 (49.0)

 

networkaddress.cache.ttl (default: -1):

As specified in the java.security file to indicate the caching policy for successful name lookups from the name service,

the value is specified as an integer to indicate the number of seconds to cache the successful lookup.

A value of -1 indicates “cache forever".

 

networkaddress.cache.negative.ttl (default: 10):

Also defined in the java.security file, is used to indicate the caching policy for unsuccessful name lookups from the name service.

The value is specified as an integer to indicate the number of seconds to cache the failure for unsuccessful lookups.

 

As an example, in the java.security file you could define:

networkaddress.cache.ttl=60

networkaddress.cache.negative.ttl=10

  1. /etc/hosts的優先權高於DNS []
本篇發表於 IT 並標籤為 。將永久鏈結加入書籤。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

你可以使用這些 HTML 標籤與屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

(若看不到驗證碼,請重新整理網頁。)