Gemäß der Antwort von Byron können Sie keine networkaddress.cache.ttl
oder networkaddress.cache.negative.ttl
als Systemeigenschaften festlegen, indem Sie das -D
Flag oder den Aufruf verwenden, System.setProperty
da dies keine Systemeigenschaften sind - es handelt sich um Sicherheitseigenschaften .
Wenn Sie eine Systemeigenschaft verwenden möchten, um dieses Verhalten auszulösen (damit Sie das -D
Flag oder den Aufruf verwenden können System.setProperty
), müssen Sie die folgende Systemeigenschaft festlegen :
-Dsun.net.inetaddr.ttl=0
Diese Systemeigenschaft aktiviert den gewünschten Effekt.
Beachten Sie jedoch Folgendes: Wenn Sie das -D
Flag beim Starten des JVM-Prozesses nicht verwenden und stattdessen den Code aufrufen:
java.security.Security.setProperty("networkaddress.cache.ttl" , "0")
Dieser Code muss ausgeführt werden, bevor ein anderer Code in der JVM versucht, Netzwerkvorgänge auszuführen.
Dies ist wichtig, da dies beispielsweise Security.setProperty
nicht funktioniert , wenn Sie eine .war-Datei aufgerufen und diese .war für Tomcat bereitgestellt haben: Tomcat verwendet den Java-Netzwerkstapel, um sich viel früher zu initialisieren, als der .war-Code ausgeführt wird. Aufgrund dieser "Race-Bedingung" ist es normalerweise bequemer, das -D
Flag zu verwenden, wenn der JVM-Prozess gestartet wird.
Wenn Sie nicht verwenden -Dsun.net.inetaddr.ttl=0
oder aufrufen Security.setProperty
, müssen Sie $JRE_HOME/lib/security/java.security
diese Sicherheitseigenschaften in dieser Datei bearbeiten und festlegen, z
networkaddress.cache.ttl = 0
networkaddress.cache.negative.ttl = 0
Beachten Sie jedoch die Sicherheitswarnungen in den Kommentaren zu diesen Eigenschaften. Tun Sie dies nur, wenn Sie einigermaßen sicher sind, dass Sie nicht anfällig für DNS-Spoofing-Angriffe sind .
java.security.Security
(zumindest in jdk7)Java hat ein ernsthaft seltsames DNS-Caching-Verhalten. Am besten deaktivieren Sie das DNS-Caching oder stellen Sie eine niedrige Zahl wie 5 Sekunden ein.
quelle
System.getSecurityManager()
. Docs für Java 8: docs.oracle.com/javase/8/docs/api/java/lang/…Dies wurde offensichtlich in neueren Versionen (SE 6 und 7) behoben. Beim Ausführen des folgenden Codeausschnitts, während die Aktivität von Port 53 mit tcpdump überwacht wird, tritt eine maximale Caching-Zeit von 30 Sekunden auf.
quelle
Um Byrons Antwort zu erweitern, müssen Sie meines Erachtens die Datei
java.security
im%JRE_HOME%\lib\security
Verzeichnis bearbeiten , um diese Änderung zu bewirken.Hier ist der relevante Abschnitt:
Dokumentation zur
java.security
Datei hier .quelle
Um die anderen Antworten zusammenzufassen,
<jre-path>/lib/security/java.security
können Sie in den Wert der Eigenschaft festlegen,networkaddress.cache.ttl
um anzupassen, wie DNS-Lookups zwischengespeichert werden. Beachten Sie, dass dies keine Systemeigenschaft, sondern eine Sicherheitseigenschaft ist. Ich konnte dies einstellen mit:Dies kann auch durch die Systemeigenschaft festgelegt werden,
-Dsun.net.inetaddr.ttl
obwohl dies eine Sicherheitseigenschaft nicht überschreibt, wenn sie an anderer Stelle festgelegt wird.Ich möchte auch hinzufügen, dass die Einstellung
networkaddress.cache.ttl
nicht ausreicht , wenn Sie dieses Problem mit Webdiensten in WebSphere wie ich sehen . Sie müssen die Systemeigenschaft festlegendisableWSAddressCaching
zutrue
. Im Gegensatz zur Time-to-Live-Eigenschaft kann dies als JVM-Argument oder über festgelegt werdenSystem.setProperty
.IBM hat hier einen ziemlich detaillierten Beitrag darüber, wie WebSphere mit DNS-Caching umgeht . Das relevante Stück zu dem oben genannten ist:
quelle
Nach den offiziellen Oracle Java - Eigenschaften ,
sun.net.inetaddr.ttl
ist Sun Implementierung spezifische Eigenschaft, die „in zukünftigen Versionen möglicherweise nicht unterstützt“. "Der bevorzugte Weg ist die Verwendung der Sicherheitseigenschaft"networkaddress.cache.ttl
.quelle