Selon la réponse de Byron, vous ne pouvez pas définir networkaddress.cache.ttl
ou en networkaddress.cache.negative.ttl
tant que propriétés système en utilisant l' -D
indicateur ou en appelant System.setProperty
car ce ne sont pas des propriétés système - ce sont des propriétés de sécurité .
Si vous souhaitez utiliser une propriété System pour déclencher ce comportement (afin que vous puissiez utiliser l' -D
indicateur ou l'appel System.setProperty
), vous souhaiterez définir la propriété System suivante :
-Dsun.net.inetaddr.ttl=0
Cette propriété système activera l'effet souhaité.
Mais soyez conscient: si vous n'utilisez pas l' -D
indicateur lors du démarrage du processus JVM et choisissez de l'appeler à partir du code à la place:
java.security.Security.setProperty("networkaddress.cache.ttl" , "0")
Ce code doit s'exécuter avant que tout autre code de la JVM tente d'effectuer des opérations de mise en réseau.
Ceci est important car, par exemple, si vous Security.setProperty
appelez un fichier .war et déployez ce .war sur Tomcat, cela ne fonctionnera pas: Tomcat utilise la pile réseau Java pour s'initialiser beaucoup plus tôt que le code de votre .war ne sera exécuté. En raison de cette «condition de concurrence», il est généralement plus pratique d'utiliser l' -D
indicateur lors du démarrage du processus JVM.
Si vous n'utilisez pas -Dsun.net.inetaddr.ttl=0
ou n'appelez pas Security.setProperty
, vous devrez modifier $JRE_HOME/lib/security/java.security
et définir ces propriétés de sécurité dans ce fichier, par exemple
networkaddress.cache.ttl = 0
networkaddress.cache.negative.ttl = 0
Mais faites attention aux avertissements de sécurité dans les commentaires entourant ces propriétés. Ne le faites que si vous êtes raisonnablement sûr que vous n'êtes pas vulnérable aux attaques d'usurpation DNS .
java.security.Security
(au moins en jdk7)Java a un comportement de mise en cache DNS très étrange. Votre meilleur pari est de désactiver la mise en cache DNS ou de la définir sur un nombre faible comme 5 secondes.
la source
System.getSecurityManager()
. Docs pour Java 8: docs.oracle.com/javase/8/docs/api/java/lang/…Cela a évidemment été corrigé dans les versions plus récentes (SE 6 et 7). Je rencontre un temps de mise en cache de 30 secondes maximum lors de l'exécution de l'extrait de code suivant tout en regardant l'activité du port 53 à l'aide de tcpdump.
la source
Pour développer la réponse de Byron, je pense que vous devez modifier le fichier
java.security
dans le%JRE_HOME%\lib\security
répertoire pour effectuer ce changement.Voici la section pertinente:
Documentation sur le
java.security
fichier ici .la source
Pour résumer les autres réponses, dans
<jre-path>/lib/security/java.security
vous pouvez définir la valeur de la propriéténetworkaddress.cache.ttl
pour ajuster la façon dont les recherches DNS sont mises en cache. Notez qu'il ne s'agit pas d' une propriété système mais d'une propriété de sécurité. J'ai pu définir ceci en utilisant:Cela peut également être défini par la propriété système
-Dsun.net.inetaddr.ttl
que cela ne remplace pas une propriété de sécurité si elle est définie ailleurs.Je voudrais également ajouter que si vous rencontrez ce problème avec les services Web dans WebSphere, comme je l'étais, la configuration
networkaddress.cache.ttl
ne sera pas suffisante. Vous devez définir la propriété systèmedisableWSAddressCaching
surtrue
. Contrairement à la propriété time-to-live, cela peut être défini comme un argument JVM ou viaSystem.setProperty
).IBM a publié un article assez détaillé sur la manière dont WebSphere gère la mise en cache DNS ici . La pièce pertinente à ce qui précède est:
la source
Selon les propriétés officielles d'Oracle Java , il
sun.net.inetaddr.ttl
s'agit d'une propriété spécifique à l'implémentation de Sun, qui "peut ne pas être prise en charge dans les versions futures". "la meilleure façon est d'utiliser la propriété de sécurité"networkaddress.cache.ttl
.la source