

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

# 設定 DNS 名稱查詢的 JVM TTL
<a name="jvm-ttl-dns"></a>

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
<a name="how-to-set-the-jvm-ttl"></a>

若要修改 JVM 的 TTL，請設定 [networkaddress.cache.ttl](https://docs.oracle.com/en/java/javase/17/core/java-networking.html#GUID-A680DADB-C4C1-40F1-B568-D9A97C917F5D) 安全屬性值。請注意， `networkaddress.cache.ttl` 是*安全屬性*，不是系統屬性，即無法使用`-D`命令列旗標來設定。

### 選項 1：在應用程式中以程式設計方式設定
<a name="set-ttl-programmatically"></a>

在應用程式啟動的[https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/security/Security.html](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/security/Security.html)早期、建立任何 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 檔案中設定
<a name="set-ttl-java-security-file"></a>

在 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 系統屬性備用 （命令列）
<a name="set-ttl-system-property"></a>

如果您無法修改安全組態或程式碼，您可以使用 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 網路屬性](https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html)參考中記載的 JDK 內部屬性，做為「未來版本可能不支援」的私有屬性。盡可能使用選項 1-2。