Ich habe ein Problem mit JVM und DNS.
Alles, was ich gerade lese (einschließlich den Dokumenten und < a href="http://www.verisigninc.com/assets/stellent/030957.pdf"> dies ) besagt, dass ich das JVM DNS-Caching mit networkaddress.cache.ttl
deaktivieren kann, das mit java.security.Security.setProperties
eingestellt werden kann. , aber durch den Standardansatz der Verwendung von Systemeigenschaften. Ich habe das erfolgreich auf 0 geändert, also kein Caching mehr in meiner JVM.
Aber jetzt, bei jedem Aufruf von InetAddress.getByName("mytest.com")
, scheint es, dass meine JVM den System DNS-Cache verwendet (in meinem Fall Windows 8). In der Tat habe ich zwischen zwei Aufrufen der Methode die BIND9-Eigenschaften für "mytest.com" geändert, aber die IP-Rückgabe ist immer noch dieselbe. Hier ist der Workflow:
setCachePolicyInJVM(0)
in meinem Java-Code. mytest.com
auf 192.168.1. 188 in BIND9, starte neu. InetAddress.getByName("mytest.com").getHostAddress();
- & gt; 192.168.1. 188
mytest.com
- & gt; 192.168.1. 160 in BIND9, neu starten. InetAddress.getByName("mytest.com").getHostAddress();
- & gt; 192.168.1. 188 (sollte 160 sein, wenn kein Caching stattgefunden hat). InetAddress.getByName("mytest.com").getHostAddress();
- & gt; 192.168.1. 160
Ich habe mehrmals gelesen, dass die JVM den Systemcache nicht benutzt, aber das ist falsch: das tut es eindeutig.
Wie erzwingen wir bei jedem Aufruf eine neue DNS-Auflösung und umgehen dabei den OS DNS-Cache?
Ich glaube, ich bin auf dieses Problem gestoßen oder ein sehr ähnliches. Was ich dann tat, war meinen eigenen DNS-Provider für die JVM zu implementieren, siehe Wie Sie den Java-DNS-Dienstanbieter ändern für Details. Du kannst das dort erwähnte Dnsjava benutzen oder selbst rollen.
Sie können Ihre $JAVA_HOME/jre/lib/security/java.security
für Java 6-8 und $JAVA_HOME/conf/security/java.security
Eigenschaftendatei bearbeiten, um die folgende Eigenschaft hinzuzufügen.
Es ist nicht möglich, es in der Befehlszeile zu setzen.
Da diese 2 Eigenschaften Teil der Sicherheitsrichtlinie sind, sind sie nicht Dies wird stattdessen über die Option -D oder die API System.setProperty () festgelegt Sie sind als Sicherheitseigenschaften festgelegt.
Um diese Eigenschaft innerhalb des Codes festzulegen, können Sie die folgende Methode verwenden.
%Vor%Oder fügen Sie die folgende Eigenschaft in der Java-Befehlszeile hinzu.
%Vor% Es ist auch wichtig zu beachten, dass Werte nur dann effektiv sind, wenn die entsprechenden networkaddress.cache.*
-Eigenschaften nicht gesetzt sind.
Siehe Java 8-Netzwerkeigenschaften , Java 9 Netzwerkeigenschaften und VeriSign DNS-Caching in Java Virtual Machines für weitere Details.
Diese Antwort fügt auch einige Details hinzu.