Zgodnie z odpowiedzią Byrona nie można ustawić networkaddress.cache.ttl
ani networkaddress.cache.negative.ttl
jako właściwości systemu za pomocą -D
flagi lub wywołania, System.setProperty
ponieważ nie są to właściwości systemu - są to właściwości zabezpieczeń .
Jeśli chcesz użyć właściwości System do wyzwalania tego zachowania (abyś mógł użyć -D
flagi lub wywołania System.setProperty
), będziesz chciał ustawić następującą właściwość System :
-Dsun.net.inetaddr.ttl=0
Ta właściwość systemowa zapewni pożądany efekt.
Ale pamiętaj: jeśli nie użyjesz -D
flagi podczas uruchamiania procesu JVM i zamiast tego wybierzesz wywołanie tego z kodu:
java.security.Security.setProperty("networkaddress.cache.ttl" , "0")
Ten kod musi zostać wykonany, zanim jakikolwiek inny kod w maszynie JVM spróbuje wykonać operacje sieciowe.
Jest to ważne, ponieważ, na przykład, gdybyś Security.setProperty
wywołał plik .war i wdrożył go na serwerze Tomcat, to nie zadziała: Tomcat używa stosu sieciowego Java do inicjalizacji znacznie wcześniej niż kod .war jest wykonywany. Z powodu tego „wyścigu” zwykle wygodniej jest używać -D
flagi podczas uruchamiania procesu JVM.
Jeśli nie używasz -Dsun.net.inetaddr.ttl=0
lub nie dzwonisz Security.setProperty
, będziesz musiał edytować $JRE_HOME/lib/security/java.security
i ustawić te właściwości zabezpieczeń w tym pliku, np
networkaddress.cache.ttl = 0
networkaddress.cache.negative.ttl = 0
Zwróć jednak uwagę na ostrzeżenia dotyczące bezpieczeństwa w komentarzach dotyczących tych nieruchomości. Rób to tylko wtedy, gdy masz wystarczającą pewność, że nie jesteś podatny na ataki polegające na spoofingu DNS .
java.security.Security
(przynajmniej w jdk7)Java ma bardzo dziwne zachowanie buforowania DNS. Najlepiej jest wyłączyć buforowanie dns lub ustawić go na jakąś niską liczbę, na przykład 5 sekund.
źródło
System.getSecurityManager()
. Dokumenty dla Java 8: docs.oracle.com/javase/8/docs/api/java/lang/…Zostało to oczywiście naprawione w nowszych wersjach (SE 6 i 7). Maksymalny czas buforowania wynosi 30 sekund podczas uruchamiania następującego fragmentu kodu podczas oglądania aktywności portu 53 przy użyciu tcpdump.
źródło
Aby rozwinąć odpowiedź Byrona, uważam, że musisz edytować plik
java.security
w%JRE_HOME%\lib\security
katalogu, aby wprowadzić tę zmianę.Oto odpowiednia sekcja:
Dokumentacja do
java.security
akt tutaj .źródło
Podsumowując inne odpowiedzi,
<jre-path>/lib/security/java.security
możesz ustawić wartość właściwości,networkaddress.cache.ttl
aby dostosować sposób buforowania wyszukiwania DNS. Należy zauważyć, że nie jest to właściwość systemowa, ale właściwość zabezpieczeń. Mogłem to ustawić za pomocą:Można to również ustawić we właściwości systemowej
-Dsun.net.inetaddr.ttl
chociaż nie spowoduje to zastąpienia właściwości zabezpieczeń, jeśli zostanie ustawiona w innym miejscu.Chciałbym również dodać, że jeśli widzisz ten problem z usługami WWW w WebSphere, tak jak ja, ustawienie
networkaddress.cache.ttl
nie wystarczy. Musisz ustawić właściwość systemowądisableWSAddressCaching
natrue
. W przeciwieństwie do właściwości czasu wygaśnięcia można ją ustawić jako argument maszyny JVM lub za pośrednictwemSystem.setProperty
).IBM ma dość szczegółowe post jak WebSphere uchwyty buforowanie DNS tutaj . Odpowiedni fragment do powyższego to:
źródło
Zgodnie z oficjalnymi właściwościami java Oracle ,
sun.net.inetaddr.ttl
jest to właściwość specyficzna dla implementacji firmy Sun, która „może nie być obsługiwana w przyszłych wersjach”. „preferowanym sposobem jest użycie zabezpieczenia”networkaddress.cache.ttl
.źródło