簡體   English   中英

JVM和OS DNS緩存

[英]JVM and OS DNS Caching

我正面臨着JVM和DNS的問題。

一切我讀(包括該文檔 )說,我可以通過禁用JVM DNS緩存networkaddress.cache.ttl ,它可以使用設置java.security.Security.setProperties ,而是通過使用系統屬性的標准方法。 我已成功將其更改為0,因此我的JVM中不再有緩存。

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

  1. 我的Java代碼中的setCachePolicyInJVM(0)
  2. mytest.com設置為192.168.1。 在BIND9中188 ,重啟。
  3. InetAddress.getByName("mytest.com").getHostAddress(); - > 192.168.1。 188
  4. 設置mytest.com - > 192.168.1。 在BIND9 160 ,重啟。
  5. InetAddress.getByName("mytest.com").getHostAddress(); - > 192.168.1。 188 (如果沒有緩存,則應為160 )。
  6. 刷新Windows DNS
  7. InetAddress.getByName("mytest.com").getHostAddress(); - > 192.168.1。 160

我已多次讀過JVM不使用系統緩存,但這是錯誤的:它顯然是這樣。

我們如何繞過操作系統 DNS緩存強制每次調用新的DNS解析?

我想我遇到過這個問題,或者是一個非常類似的問題。 我當時做的是為JVM實現我自己的DNS提供程序,請參閱如何更改java dns服務提供程序以獲取詳細信息。 你可以使用那里提到的dnsjava或自己動手。

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

networkaddress.cache.ttl=1

無法在命令行中設置它。

由於這兩個屬性是安全策略的一部分,因此它們不是由-D選項或System.setProperty()API設置的,而是設置為安全屬性。

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

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

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

-Dnetworkaddress.cache.ttl=1

同樣重要的是要注意,僅當未設置相應的networkaddress.cache.*屬性時,值才有效。

有關更多詳細信息,請參閱Java 虛擬機中的 Java 8網絡屬性Java 9網絡屬性VeriSign DNS緩存

這個答案也增加了一些細節。

這里看來你應該設置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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM