JVM의 DNS 캐시 프로그래밍

JVM은 일단 실행되면 그 이후부터의 도메인 네임을 통한 네트워크 접속시 DNS 정보를 캐싱한다. 그것도 JVM을 재시작 할 때까지 영원히 캐싱한다.

 

요즘 OpenAPI를 사용하는 경우가 많은데, 이 JVM의 DNS 캐시는 OpenAPI를 제공하는 서버의 IP 주소가 갑자기 바뀌었을 경우 문제를 일으킬 수 있다.

Java 웹 서버를 운영할 때 상대방 OpenAPI 서버의 IP가 바뀌면 웹 서버를 껐다 켜야만 DNS 정보가 갱신되어 그제서야 API 서버에 제대로 접속이 된다. 따라서 OpenAPI 를 사용하는 웹 서비스로 만들 경우에는 DNS 캐시 기능을 끄거나 캐싱 시간을 조정할 필요가 있다.

 

관련 정보 :

 

가장 간단한 해결 방법은 Java 실행 옵션에 시스템 프라퍼티를 지정하는 것이다. 아래는 DNS 캐싱 시간을 30초로 지정한다. SUN/Oracle JVM에 한한다.

  1. java -Dsun.net.inetaddr.ttl=30

 

Tomcat의 경우에는 $CATALINA_HOME/bin/setenv.sh 파일에서 CATALINA_OPTS 혹은 JAVA_OPTS 환경 변수를 지정하고 위의 프라퍼티를 지정한다.

 

다음 방법은 Java 1.4 이상 버전에서 jre/lib/security/java.security 파일에 프라퍼티를 추가하는 것이다. 기본값은 -1이며 영원히 캐싱한다는 의미이다. 다음은 30초간 캐싱한다고 지정한다. 0은 캐시를 끈다.

  1. networkaddress.cache.ttl=30

 

프로그램적으로도 가능하다.

  1. java.security.Security.setProperty("networkaddress.cache.ttl" , "30");

 

이 글은 스프링노트에서 작성되었습니다.