[英]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返回仍然是相同的。 這是工作流程:
setCachePolicyInJVM(0)
。 mytest.com
設置為192.168.1。 在BIND9中188 ,重啟。 InetAddress.getByName("mytest.com").getHostAddress();
- > 192.168.1。 188 mytest.com
- > 192.168.1。 在BIND9 160 ,重啟。 InetAddress.getByName("mytest.com").getHostAddress();
- > 192.168.1。 188 (如果沒有緩存,則應為160 )。 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.