この記事の例では、Java で DNS キャッシュをクリーニングする方法について説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
1. テスト環境
OS:Windows7x64
JDK: 1.6.0_45
2. jvm の DNS キャッシュをクリアする 4 つの方法を見つけました。自分の状況に応じて選択できます。
1. InetAddress.getByName() を初めて呼び出す前に、java.security.Security.setProperty("networkaddress.cache.ttl", "0"); を設定します。
2. jre/lib/security/java.security の下にある networkaddress.cache.ttl プロパティを変更します。
3. jvm 起動パラメータで -Dsun.net.inetaddr.ttl=0 を設定します。
4. リフレクションによるクリーニング (この記事の clearCache メソッドなど)
3. コード
次のようにコードをコピーします。
java.lang.reflect.Fieldをインポートします。
インポート java.net.InetAddress;
インポート java.net.UnknownHostException;
java.util.Mapをインポートします。
/**
* @作者 xiaofei.wxf
* @日付 13-12-18
*/
パブリック クラス DNSCacheTest {
/**
※1. InetAddress.getByName()を初めて呼び出す前に、java.security.Security.setProperty("networkaddress.cache.ttl", "0");を設定してください。
* 2. jre/lib/security/java.security の networkaddress.cache.ttl プロパティを変更します。
* 3. jvm 起動パラメータで -Dsun.net.inetaddr.ttl=0 を設定します。
* 4.clearCacheメソッドを呼び出してクリアします
*
* @param 引数
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException、NoSuchFieldException、IllegalAccessException {
java.security.Security.setProperty("ネットワークアドレス.キャッシュ.ttl", "0");
InetAddress addr1 = InetAddress.getByName("www.baidu.com");
System.out.println(addr1.getHostAddress());
//clearCache();
// 次の行にブレークポイントを設定します。
//この値はクラスのロード時に決定され (InetAddress.getByName を使用する前に設定する必要があります)、キャッシュされているため、ここに置くことは無効です。
//java.security.Security.setProperty("networkaddress.cache.ttl", "0");
InetAddress addr2 = InetAddress.getByName("www.baidu.com");
System.out.println(addr2.getHostAddress());
InetAddress addr3 = InetAddress.getByName("www.google.com");
System.out.println(addr3.getHostAddress());
InetAddress addr4 = InetAddress.getByName("www.google.com");
System.out.println(addr4.getHostAddress());
//clearCache();
}
public static void clearCache() は NoSuchFieldException、IllegalAccessException をスローします {
//キャッシュデータの変更を開始
Classclazz = java.net.InetAddress.class;
最終フィールドcacheField = clazz.getDeclaredField("addressCache");
キャッシュフィールド.setAccessible(true);
最終オブジェクト obj =cacheField.get(clazz);
クラスcacheClazz = obj.getClass();
最終フィールドcachePolicyField =cacheClazz.getDeclaredField("type");
最終フィールドcacheMapField =cacheClazz.getDeclaredField("cache");
キャッシュポリシーフィールド.setAccessible(true);
キャッシュマップフィールド.setAccessible(true);
最終マップのcacheMap = (Map)cacheMapField.get(obj);
System.out.println(cacheMap);
acheMap.remove("www.baidu.com");
}
}
この記事が皆さんの Java プログラミングに役立つことを願っています。