Wie man Java Ehre der DNS-Caching Timeout?
Verwenden wir GSLB für die geo-distribution und load-balancing. Jeden Dienst zugeordnet ist, einen festen domain-Namen. Durch einige DNS-Magie, der domain-name aufgelöst in eine IP, die am nächsten an den server mit der geringsten Last. Für das load-balancing zu arbeiten, muss der Anwendungsserver zu Ehren der TTL vom DNS-Antwort und zum auflösen der domain-name wieder, wenn die cache-Zeiten aus. Allerdings konnte ich nicht herausfinden, ein Weg, dies zu tun in Java.
Die Anwendung wird in Java 5, läuft auf Linux (Centos 5).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java hat einige sehr seltsame dns-caching-Verhalten. Ihre beste Wette ist zu deaktivieren, dns-caching oder legen Sie es auf einen niedrigen Wert wie 5 Sekunden.
System.getSecurityManager()
. In der Dokumentation zur Java-8: docs.oracle.com/javase/8/docs/api/java/lang/...java
Befehl nicht bekommen, ein. Sie können eine, jedoch.Pro Byrons Antwort, Sie können nicht
networkaddress.cache.ttl
odernetworkaddress.cache.negative.ttl
als System-Eigenschaften, indem Sie die-D
Flagge oder der AufrufSystem.setProperty
denn diese sind nicht-System-Eigenschaften - Sie sind Sicherheit Eigenschaften.Wenn Sie möchten, verwenden Sie eine System-Eigenschaft auslösen dieses Verhalten (so können Sie die
-D
flag oder callSystem.setProperty
), werden Sie wollen, um die folgenden System Eigenschaft:Diese Systemeigenschaft ermöglicht den gewünschten Effekt.
Aber bewusst sein: wenn Sie nicht die
-D
flag beim starten der JVM-Prozess und wählt diesen Aufruf aus code statt:Dieser code muss führen vor jedem anderen code in der JVM auszuführen versucht-networking-Operationen.
Dies ist wichtig, weil, zum Beispiel, wenn Sie aufgerufen
Security.setProperty
in einem .die war-Datei und Einsatz .Krieg Tomcat, würde dies nicht funktionieren: Tomcat verwendet das Java-Netzwerk-stack zu initialisieren sich viel früher als Ihr .Krieg der code ausgeführt wird. Weil dieses 'race-condition', normalerweise ist es bequemer zu verwenden, die-D
flag beim starten der JVM-Prozess.Wenn Sie nicht
-Dsun.net.inetaddr.ttl=0
oder rufen SieSecurity.setProperty
Sie Bearbeiten müssen$JRE_HOME/lib/security/java.security
und legen Sie die Sicherheits-Eigenschaften, die in dieser Datei, z.B.Aber achten Sie auf die Sicherheits-Warnungen in den Kommentaren rund um diese Eigenschaften. Tun Sie dies nur, wenn Sie einigermaßen zuversichtlich, dass Sie sind nicht anfällig für DNS-spoofing-Angriffe.
java.security.Security
(zumindest in jdk7)Dieser hat offensichtlich bereits in neueren Versionen behoben (SE 6 und 7). Ich erlebe eine 30-Sekunden-caching-Dauer max beim ausführen des folgenden code-snippet ein, während Sie port 53 Aktivitäten mit Hilfe von tcpdump.
Erweitern Byrons Antwort, ich glaube, Sie brauchen, um die Datei zu Bearbeiten
java.security
im%JRE_HOME%\lib\security
- Verzeichnis, um die Wirkung dieser Veränderung.Hier ist der entsprechende Abschnitt:
Dokumentation auf der
java.security
Datei hier.Zusammenzufassen, die die anderen Antworten in
<jre-path>/lib/security/java.security
Sie können den Wert der Eigenschaftnetworkaddress.cache.ttl
anpassen, wie DNS-Abfragen zwischengespeichert werden. Beachten Sie, dass dies nicht ein-system-Eigenschaft, sondern eine Sicherheits-Eigenschaft. Ich war in der Lage, diese mithilfe:Diese kann auch eingestellt werden, indem die Eigenschaft system
-Dsun.net.inetaddr.ttl
wenn diese nicht zum überschreiben einer security-Eigenschaft, wenn es gesetzt ist anderswo.Ich würde auch gerne hinzufügen, dass, wenn Sie sehen, dieses Problem mit web services in WebSphere, wie ich war, die Einstellung
networkaddress.cache.ttl
wird nicht genug sein. Sie müssen die system-EigenschaftdisableWSAddressCaching
zutrue
. Im Gegensatz zu den time-to-live-Eigenschaft, dies kann als ein JVM-argument oder überSystem.setProperty
).IBM hat einen ziemlich ausführlichen Beitrag auf, wie WebSphere Griffe DNS-caching -hier. Das entsprechende Stück zu den oben genannten ist:
Entsprechend der offizielle oracle java-Eigenschaften,
sun.net.inetaddr.ttl
Sun-Implementierung-spezifische Eigenschaft, die "nicht unterstützt, in künftigen Versionen". "die bevorzugte Methode ist die Verwendung der security-Eigenschaft"networkaddress.cache.ttl
.