View a markdown version of this page

設定 DNS 名稱查詢的 JVM TTL - AWS SDK for Java 2.x

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定 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.ttl 安全屬性值。請注意, networkaddress.cache.ttl安全屬性,不是系統屬性,即無法使用-D命令列旗標來設定。

選項 1:在應用程式中以程式設計方式設定

在應用程式啟動的java.security.Security.setProperty()早期、建立任何 AWS SDK 用戶端之前,以及提出任何網路請求之前呼叫 :

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 網路屬性參考中記載的 JDK 內部屬性,做為「未來版本可能不支援」的私有屬性。盡可能使用選項 1-2。