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 地址缓存一段指定的时间,即 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

要修改 JVM 的 TTL,请设置 net workaddress.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_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 系统属性回退(命令行)

如果无法修改安全配置或代码,则可以使用 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。