يصف المثال الموجود في هذه المقالة طريقة تنظيف ذاكرة التخزين المؤقت لـ DNS في Java. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
1. بيئة الاختبار
نظام التشغيل: Windows7 x64
جدك: 1.6.0_45
2. لقد وجدت أربع طرق لمسح ذاكرة التخزين المؤقت لنظام أسماء النطاقات لـ jvm، يمكنك الاختيار وفقًا لحالتك الخاصة.
1. قبل استدعاء InetAddress.getByName() للمرة الأولى، قم بتعيين java.security.Security.setProperty("networkaddress.cache.ttl", "0");
2. قم بتعديل خاصية Networkaddress.cache.ttl ضمن jre/lib/security/java.security
3. قم بتعيين -Dsun.net.inetaddr.ttl=0 في معلمات بدء تشغيل jvm
4. التنظيف من خلال الانعكاس، مثل طريقة ClearCache في هذه المقالة
3. الكود
انسخ الكود كما يلي: package xiaofei;
import java.lang.reflect.Field;
استيراد java.net.InetAddress؛
import java.net.UnknownHostException;
import java.util.Map;
/**
* @ المؤلف xiaofei.wxf
*@التاريخ 13-12-18
*/
الطبقة العامة DNSCacheTest {
/**
* 1. قبل استدعاء InetAddress.getByName() للمرة الأولى، قم بتعيين java.security.Security.setProperty("networkaddress.cache.ttl", "0");
* 2. قم بتعديل خاصية Networkaddress.cache.ttl ضمن jre/lib/security/java.security
* 3. قم بتعيين -Dsun.net.inetaddr.ttl=0 في معلمات بدء تشغيل jvm
* 4. اتصل بطريقة ClearCache للمسح
*
* @param args
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, NoSuchFieldException, IllegalAccessException {
java.security.Security.setProperty("networkaddress.cache.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() throws NoSuchFieldException, IllegalAccessException {
// ابدأ في تعديل بيانات ذاكرة التخزين المؤقت
Classclazz = java.net.InetAddress.class;
الحقل النهائي لذاكرة التخزين المؤقت = clazz.getDeclaredField("addressCache");
cacheField.setAccessible(true);
الكائن النهائي obj = CacheField.get(clazz);
فئة ذاكرة التخزين المؤقتClazz = obj.getClass();
الحقل النهائي CachePolicyField = CacheClazz.getDeclaredField("type");
الحقل النهائي CacheMapField = CacheClazz.getDeclaredField("cache");
cachePolicyField.setAccessible(true);
acheMapField.setAccessible(true);
Final Map CacheMap = (Map)cacheMapField.get(obj);
System.out.println(cacheMap);
CacheMap.remove("www.baidu.com");
}
}
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.