

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 为 DNS 名称查找设置 JVM TTL
<a name="jvm-ttl-dns"></a>

Java 虚拟机 (JVM) 缓存 DNS 名称查找。当 JVM 将主机名解析为 IP 地址时，它会将该 IP 地址缓存一段指定的时间，即 *time-to-live*(TTL)。

由于 AWS 资源使用的 DNS 名称条目偶尔会发生变化，因此我们建议您将 JVM 的 TTL 值配置为 5 秒。这可确保在资源的 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，请设置 net [workaddress.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_HOME/jre/lib/security/java.security`文件中为 Java 8 或更高版本设置该`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 网络属性参考文献中记录的 JDK 内部属性](https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html)，作为 “未来的版本可能不支持” 的私有属性。尽可能使用选项 1-2。