本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定 DNS 名稱查詢的 JVM TTL
Java 虛擬機器 (JVM) 會快取 DNS 名稱查詢。當 JVM 將主機名稱解析為 IP 位址時,它會在指定的時間段內快取 IP 位址,稱為存留時間 (TTL)。
由於 AWS 資源使用偶爾變更的 DNS 名稱項目,我們建議您將 JVM 設定為 5 秒的 TTL 值。這可確保當資源的 IP 位址變更時,您的應用程式將可透過重新查詢 DNS 來接收並使用資源的新 IP 位址。
在一些 Java 組態上,JVM 的預設 TTL 會如此設定,在重新啟動 JVM 之前,「絕不」重新整理 DNS 項目。因此,如果 AWS 資源的 IP 地址在應用程式仍在執行時變更,在您手動重新啟動 JVM 並重新整理快取的 IP 資訊之前,將無法使用該資源。在此情況下,設定 JVM 的 TTL 至為關鍵,以便其定期重新整理快取的 IP 資訊。
如何設定 JVM TTL
若要修改 JVM 的 TTL,請設定 networkaddress.cache.ttlnetworkaddress.cache.ttl 是安全屬性,不是系統屬性,即無法使用-D命令列旗標來設定。
選項 1:在應用程式中以程式設計方式設定
在應用程式啟動的java.security.Security.setProperty()
import java.security.Security; public class MyApplication { public static void main(String[] args) { Security.setProperty("networkaddress.cache.ttl", "5"); // ... create SDK clients and run application } }
選項 2:在 java.security 檔案中設定
在 Java 8 的 $JAVA_HOME/jre/lib/security/java.security 檔案中設定 networkaddress.cache.ttl 屬性,或在 Java 11 或更新版本的 $JAVA_HOME/conf/security/java.security檔案中設定 屬性。
以下是 檔案的程式碼片段java.security,顯示 TTL 快取設定為 5 秒。
# # The Java-level namelookup cache policy for successful lookups: # # any negative value: caching forever # any positive value: the number of seconds to cache an address for # zero: do not cache # ...networkaddress.cache.ttl=5...
在$JAVA_HOME環境變數所代表的 JVM 上執行的所有應用程式都會使用此設定。
選項 3:使用 JDK 系統屬性備用 (命令列)
如果您無法修改安全組態或程式碼,您可以使用 JDK 系統屬性。如果未定義安全屬性,這些會充當備用。
sun.net.inetaddr.ttl– 控制成功查詢 (正 TTL)sun.net.inetaddr.negative.ttl– 控制查詢失敗 (負 TTL)
java -Dsun.net.inetaddr.ttl=5 -Dsun.net.inetaddr.negative.ttl=1 -jar myapp.jar
注意
這些是 Oracle Java 8 網路屬性