JVMはDNSキャッシュを保持している

はじまり

Tomcat上で動作しているWebアプリケーションで、設定しているホストに通信ができなくなったとの問い合わせ。
聞いてみたら、hostsに書かれていたIPアドレスを変更したとのこと。

状況

  1. サーバ[localhost]上のWebアプリケーションは「example」というホストに通信するように設定されている。(アプリケーションはexampleで動いている訳ではない)
  2. localhostのhostsを下記のように変更。
  3. Webアプリケーション側から見るとホストは変更されてないのに変更後のIPに繋がらない。(変更後のIPである「203.0.113.0」に繋がって欲しいのに、変更前のIPである「192.0.2.0」のIPと通信が行われる)
変更前hosts
192.0.2.0    example
変更後hosts
203.0.113.0  example

結論

調べてみたら、デフォルトだとJVMは無期限でDNSキャッシュを保持しているからとの事。

jre/lib/security/java.security」の「networkaddress.cache.ttl」でキャッシュの保持時間を変更できるらしいので、0に変更したらhosts変更後は新たなipに接続されました。(0はキャッシュの保持を行わない)

変更前java.security
#networkaddress.cache.ttl=-1
変更後java.security
networkaddress.cache.ttl=0

反省

当初、どこでキャッシュを持っているのか想像もつかなかったので、とりあえずアプリケーションのソース見たりしてましたw
で、Tomcatかな?と言う事でGoogleで調べるも、調査のためのワードがよくわからず。
詳しい方に聞いたら「jvm dns」等で検索して判明しました。

この事自体を知らなかったのはよかったとしても、アプリケーションからどういう経路で通信を行なっているか、ネットワークの基礎がわかってないから「DNS」という単語出なかったんだろうなぁ。。。