2013-06-28 59 views
9

我正面臨JVM和DNS的問題。JVM和OS DNS緩存

一切我讀(包括the docsthis)說,我可以使用networkaddress.cache.ttl,可使用java.security.Security.setProperties設置禁用JVM DNS緩存,而是通過使用系統屬性的標準方法。我已經成功地將其更改爲0,因此我的JVM中沒有更多的緩存。

但是現在,在每次調用InetAddress.getByName("mytest.com")時,似乎我的JVM正在使用DNS緩存(在我的情況下是Windows 8)系統。實際上,在該方法的兩次調用之間,我已更改「mytest.com」的BIND9屬性,但IP返回值仍然相同。這裏是工作流程:

  1. setCachePolicyInJVM(0)在我的Java代碼。
  2. set mytest.com to 192.168.1。 在BIND9中重新啓動。
  3. InetAddress.getByName("mytest.com").getHostAddress(); - > 192.168.1。
  4. set mytest.com - > 192.168.1。 在BIND9中重新啓動。
  5. InetAddress.getByName("mytest.com").getHostAddress(); - > 192.168.1。 (應該是如果沒有緩存)。
  6. 刷新Windows DNS
  7. InetAddress.getByName("mytest.com").getHostAddress();→192.168.1。

我看過好幾次了JVM不使用系統緩存,但這是錯誤的:它顯然不會。

我們如何強制每次調用新的DNS解析,繞過OS DNS緩存?

+0

這對我也很有用:我試圖禁用JVM DNS緩存,以便在故障轉移場景中嘗試在負載均衡器的另一端執行所有IP地址。由於我們處於故障轉移場景,因此我無法提前知道新的IP地址,並且也不清楚新IP地址何時會聯機。所以我真的需要每次都進行DNS查詢。 –

回答

3

我想我遇到了這個問題,或者非常相似的問題。我所做的是爲JVM實現自己的DNS提供程序,詳情請參見how to change the java dns service provider。你可以使用那裏提到的dnsjava或者自己推出。

+0

你可以更改「根」DNS服務提供商嗎?我認爲你只能添加新的提供者,當較早的提供者是負面的時候會被調用。 –

0

here看來你應該設置sun.net.inetaddr.ttl。這對我有效。從鏈接

例子:

java -Dsun.net.inetaddr.ttl=1 test 
Enter the hostname 
rrr 
Output isrrr/129.145.146.100 
Enter the hostname 
rrr 
Output isrrr/129.147.146.100 
+0

還提到了Java 8的屬性https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html#nct –

0

您可以編輯您$JAVA_HOME/jre/lib/security/java.security爲Java 6-8和$JAVA_HOME/conf/security/java.security屬性文件中添加以下屬性。

networkaddress.cache.ttl=1 

無法在命令行中進行設置。

由於這些2個特性是安全策略的一部分,它們不是通過 任-D選項或System.setProperty()API集,而不是 它們被設定爲安全屬性。

要在代碼中設置此屬性,可以使用以下方法。

java.security.Security.setProperty("networkaddress.cache.ttl", "1") 

或者在java命令行中添加以下屬性。

-Dnetworkaddress.cache.ttl=1 

同樣重要的是要注意,值只有對應networkaddress.cache.*屬性未設置有效。

請參閱Java 8 Networking Properties,Java 9 Networking PropertiesVeriSign DNS Caching in Java Virtual Machines瞭解更多詳情。

answer也增加了一些細節。