Согласно ответу Байрона, вы не можете установить networkaddress.cache.ttl
или в networkaddress.cache.negative.ttl
качестве свойств системы с помощью -D
флага или вызова, System.setProperty
потому что это не свойства системы - это свойства безопасности .
Если вы хотите использовать свойство System для запуска этого поведения (чтобы вы могли использовать -D
флаг или вызов System.setProperty
), вам нужно будет установить следующее свойство System :
-Dsun.net.inetaddr.ttl=0
Это системное свойство позволит добиться желаемого эффекта.
Но имейте в виду: если вы не используете -D
флаг при запуске процесса JVM и выбираете вызов этого из кода вместо этого:
java.security.Security.setProperty("networkaddress.cache.ttl" , "0")
Этот код должен выполняться до того, как любой другой код в JVM попытается выполнить сетевые операции.
Это важно, потому что, например, если вы вызвали Security.setProperty
файл .war и развернули этот .war в Tomcat, это не сработает: Tomcat использует сетевой стек Java для инициализации намного раньше, чем выполняется ваш код .war. Из-за этого «состояния гонки» обычно удобнее использовать -D
флаг при запуске процесса JVM.
Если вы не используете -Dsun.net.inetaddr.ttl=0
или не вызываете Security.setProperty
, вам нужно будет отредактировать $JRE_HOME/lib/security/java.security
и установить эти свойства безопасности в этом файле, например
networkaddress.cache.ttl = 0
networkaddress.cache.negative.ttl = 0
Но обратите внимание на предупреждения о безопасности в комментариях к этим свойствам. Делайте это только в том случае, если вы достаточно уверены, что не подвержены атакам с подменой DNS .
java.security.Security
(по крайней мере, в jdk7)У Java есть очень странное поведение кеширования DNS. Лучше всего отключить кеширование DNS или установить какое-то небольшое число, например, 5 секунд.
источник
System.getSecurityManager()
. Документы для Java 8: docs.oracle.com/javase/8/docs/api/java/lang/…Очевидно, это было исправлено в новых версиях (SE 6 и 7). Максимальное время кэширования составляет 30 секунд при запуске следующего фрагмента кода при просмотре активности порта 53 с помощью tcpdump.
источник
Чтобы расширить ответ Байрона, я считаю, что вам нужно отредактировать файл
java.security
в%JRE_HOME%\lib\security
каталоге, чтобы выполнить это изменение.Вот соответствующий раздел:
Документация по
java.security
файлу здесь .источник
Подводя итог другим ответам,
<jre-path>/lib/security/java.security
вы можете установить значение свойства,networkaddress.cache.ttl
чтобы настроить кэширование запросов DNS. Обратите внимание, что это не системное свойство, а свойство безопасности. Я смог установить это, используя:Это также может быть установлено системным свойством,
-Dsun.net.inetaddr.ttl
хотя это не переопределит свойство безопасности, если оно установлено в другом месте.Я также хотел бы добавить, что если вы видите эту проблему с веб-сервисами в WebSphere, как и я, настройки
networkaddress.cache.ttl
будет недостаточно. Вам необходимо установить системное свойствоdisableWSAddressCaching
наtrue
. В отличие от свойства time-to-live, это может быть установлено как аргумент JVM или черезSystem.setProperty
).IBM имеет довольно подробный пост о том , как WebSphere ручки кэширования DNS здесь . Соответствующая часть вышесказанного:
источник
Согласно официальным свойствам Java oracle ,
sun.net.inetaddr.ttl
это свойство Sun , зависящее от реализации, которое «может не поддерживаться в будущих выпусках». «предпочтительный способ - использовать свойство безопасности»networkaddress.cache.ttl
.источник