De acordo com a resposta de Byron, você não pode definir networkaddress.cache.ttl
ou networkaddress.cache.negative.ttl
como Propriedades do sistema usando o -D
sinalizador ou chamando System.setProperty
porque essas não são propriedades do sistema - são propriedades de segurança .
Se você deseja usar uma propriedade do sistema para acionar esse comportamento (para que você possa usar o -D
sinalizador ou chamada System.setProperty
), você desejará definir a seguinte propriedade do sistema :
-Dsun.net.inetaddr.ttl=0
Esta propriedade do sistema habilitará o efeito desejado.
Mas esteja ciente: se você não usar o -D
sinalizador ao iniciar o processo JVM e optar por chamar isso a partir do código:
java.security.Security.setProperty("networkaddress.cache.ttl" , "0")
Este código deve ser executado antes que qualquer outro código na JVM tente realizar operações de rede.
Isso é importante porque, por exemplo, se você chamasse Security.setProperty
um arquivo .war e implantasse esse .war no Tomcat, isso não funcionaria: o Tomcat usa a pilha de rede Java para inicializar a si mesmo muito antes da execução do código .war. Por causa dessa 'condição de corrida', geralmente é mais conveniente usar o -D
sinalizador ao iniciar o processo JVM.
Se você não usar -Dsun.net.inetaddr.ttl=0
ou chamar Security.setProperty
, precisará editar $JRE_HOME/lib/security/java.security
e definir essas propriedades de segurança nesse arquivo, por exemplo
networkaddress.cache.ttl = 0
networkaddress.cache.negative.ttl = 0
Mas preste atenção aos avisos de segurança nos comentários sobre essas propriedades. Só faça isso se você estiver razoavelmente confiante de que não é suscetível a ataques de spoofing de DNS .
java.security.Security
(pelo menos em jdk7)Java tem um comportamento de cache dns seriamente estranho. Sua melhor aposta é desligar o cache de dns ou configurá-lo para um número baixo, como 5 segundos.
fonte
System.getSecurityManager()
. Documentos para Java 8: docs.oracle.com/javase/8/docs/api/java/lang/…Obviamente, isso foi corrigido nas versões mais recentes (SE 6 e 7). Eu experimento um tempo máximo de armazenamento em cache de 30 segundos ao executar o trecho de código a seguir enquanto observo a atividade da porta 53 usando tcpdump.
fonte
Para expandir a resposta de Byron, acredito que você precisa editar o arquivo
java.security
no%JRE_HOME%\lib\security
diretório para efetuar essa alteração.Aqui está a seção relevante:
Documentação no
java.security
arquivo aqui .fonte
Para resumir as outras respostas, em
<jre-path>/lib/security/java.security
você pode definir o valor da propriedadenetworkaddress.cache.ttl
para ajustar como as pesquisas DNS são armazenadas em cache. Observe que esta não é uma propriedade do sistema, mas uma propriedade de segurança. Consegui definir isso usando:Isso também pode ser definido pela propriedade do sistema,
-Dsun.net.inetaddr.ttl
embora não substitua uma propriedade de segurança se for definida em outro lugar.Também gostaria de acrescentar que, se você está vendo esse problema com serviços da Web no WebSphere, como eu estava, a configuração
networkaddress.cache.ttl
não será suficiente. Você precisa definir a propriedade do sistemadisableWSAddressCaching
comotrue
. Ao contrário da propriedade time-to-live, isso pode ser definido como um argumento JVM ou viaSystem.setProperty
).A IBM tem uma postagem bem detalhada sobre como o WebSphere lida com o cache DNS aqui . A peça relevante para o acima é:
fonte
De acordo com as propriedades oficiais do oracle java ,
sun.net.inetaddr.ttl
é uma propriedade específica da implementação da Sun, que "pode não ser suportada em versões futuras". "a forma preferida é usar a propriedade de segurança"networkaddress.cache.ttl
.fonte