Я использую Java 8 (OpenJDK). Похоже, что лучший способ отключить кэш DNS в Java - установить networkaddress.cache.ttl=0
в $JAVA_HOME/jre/lib/security/java.security
.
Я пробовал это, но, похоже, это не имеет никакого значения, независимо от того, какое значение я там указывал, записи DNS кэшируются в течение ~ 5 секунд. Я знаю, что значение установлено правильно, потому что я проверяю его с помощью java.security.Security.getProperty("networkaddress.cache.ttl")
.
Я тестирую Java-кеш с HttpURLConnection
клиентом и сравниваю его с необработанным curl
клиентом, curl вообще не кешируется. Мой сервер является балансировщиком нагрузки, который возвращает один из 3 разных ips для каждого запроса в циклическом переборе. Каждый из этих ips размещает веб-сервис, который возвращает имя хоста, на котором он работает.
Вот так выглядит мой java-клиент:
public static void main(String[] args) throws Exception {
System.out.println("networkaddress.cache.ttl=" + java.security.Security.getProperty("networkaddress.cache.ttl"));
Thread.sleep(1000);
printServerHost();
Thread.sleep(2000);
printServerHost();
Thread.sleep(4000);
printServerHost();
Thread.sleep(6000);
printServerHost();
Thread.sleep(11000);
printServerHost();
}
public static void printServerHost() throws Exception{
URL url = new URL("http://server/");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Cache-Control", "no-cache");
con.setRequestProperty("accept", "application/json");
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String response = reader.readLine();
reader.close();
con.disconnect();
System.out.println(response);
}
Какие выходы:
networkaddress.cache.ttl=0
ip-172-31-12-68.ec2.internal
ip-172-31-12-68.ec2.internal
ip-172-31-12-68.ec2.internal
ip-172-31-41-56.ec2.internal
ip-172-31-16-34.ec2.internal
А вот так выглядит мой клиент curl:
curl server
sleep 2s
curl server
sleep 4s
curl server
sleep 6s
curl server
sleep 11s
curl server
Какие выходы:
ip-172-31-41-56.ec2.internal
ip-172-31-16-34.ec2.internal
ip-172-31-12-68.ec2.internal
ip-172-31-41-56.ec2.internal
ip-172-31-16-34.ec2.internal
Что мне не хватает? Должен ли я также что-то настроить в HttpURLConnection
? Еще один конфиг JVM? Может это другой кеш, а не днс, пул соединений или пул сокетов?