通过JAVA反射修改JDK1.6*当中DNS缓存内容
2015-02-11 06:06
417 查看
时间 2012-05-28 17:09:03 Taobao QA Team原文 http://qa.taobao.com/?p=15523
为了实现性能压测时的域名动态绑定功能,尝试通过java反射修改JDK1.6×当中的DNS缓存,感谢在此过程中林轩同学的大力帮助。
网上也存在着修改DNS缓存的方法,但是都是基于jdk1.5的,无法应用。另外,大部分都是修改的缓存过期时间,而没有真正去尝试修改dns 的cache内容,所以尝试了很多种方法,并且查看了jdk的源代码,终于实现了修改dns缓存内容和时间,如下,欢迎大家一起探讨
修改缓存时间可以采用修改java security manage文件和增加jvm参数的方法,以下是在代码中动态修改dns的缓存时间:
public boolean addressCache(Map<String, String> addressMap) {
// 以下内容修改缓存失效时间,单位秒(-1,永久缓存;0,不缓存;其它>0的值为缓存的秒数)
Class<?> iacp = sun.net.InetAddressCachePolicy.class;
Field cachePolicyFiled = null;
Field setEnable = null;
try {
cachePolicyFiled = iacp.getDeclaredField(“cachePolicy”);
setEnable = iacp.getDeclaredField(“set”);
} catch (NoSuchFieldException e) {
logger.error(“Get cachePolicyFiled or setEnable failed!”, e);
}
cachePolicyFiled.setAccessible(true);
setEnable.setAccessible(true);
try {
cachePolicyFiled.set(null, -1);
setEnable.set(null, true);
} catch (IllegalArgumentException e) {
logger.error(“Set cachePolicyFiled and setEnable failed!”, e);
} catch (IllegalAccessException e) {
logger.error(“Access cachePolicyFiled and setEnable failed!”, e);
}
// 以下内容修改DNS的缓存数据,实现域名动态绑定
Class<?> inetAddressClass = java.net.InetAddress.class;
Field cacheField = null;
Object addressCache = null;
InetAddress ia = null;
try {
cacheField = inetAddressClass.getDeclaredField(“addressCache”);
} catch (SecurityException e) {
logger.error(“Get addressCache security failed!”, e);
} catch (NoSuchFieldException e) {
logger.error(“Get addressCache field failed!”, e);
}
cacheField.setAccessible(true);
try {
addressCache = cacheField.get(inetAddressClass);
} catch (IllegalArgumentException e) {
logger.error(“Get cacheField IllegalArgument failed!”, e);
} catch (IllegalAccessException e) {
logger.error(“Get cacheField Access failed!”, e);
}
Class<?> cacheClazz = addressCache.getClass();
Method m_put = cacheClazz.getMethod(“put”, new Class<?>[] {
String.class, Object.class });
m_put.setAccessible(true);
try {
for (String domain : addressMap.keySet()) {
ia = Inet4Address.getByName(addressMap.get(domain));
m_put.invoke(addressCache, new Object[] { domain,
new InetAddress[] { ia } });
}
} catch (IllegalArgumentException e) {
logger.error(“Put addressCache IllegalArgument failed!”, e);
} catch (IllegalAccessException e) {
logger.error(“Put addressCache IllegalAccess failed!”, e);
} catch (InvocationTargetException e) {
logger.error(“Put addressCache InvocationTarget failed!”, e);
} catch (UnknownHostException e) {
logger.error(“Put addressCache UnknownHost failed!”, e);
}
// 修改缓存数据结束
return true;
}
在性能压测时,采用JAVA的DNS缓存有以下好处
1.无需关心dns解析时间,dns解析消耗0毫秒,几乎无消耗,这样使得压测更加关注服务器响应,压测更充分
2.可以动态修改DNS缓存,无需修改hosts文件和http链接等不灵活的方式。
3.一个jvm进程可以对应一套域名绑定,相互之间不影响,可以实现多场景,多域名绑定的需求压测。
最后,做一下广告:欢迎支持淘宝自主研发的高并发集群性能压测工具 Trunner ,更多精彩继续。
云帅 技术质量部–测试平台与发展–压测工具相关文章推荐
- Java Collections Framework之Stack源码分析缺陷,栈改进版(通过LinkedList实现)(基于JDK1.6)
- 通过Java反射在运行时修改TimerTask的执行周期并且立即生效
- java 通过反射reflect修改父类私有对象的值
- java通过类的反射获取页面修改字段前后值以及字段名称
- Java通过反射机制修改类中的私有属性的值
- Java通过反射机制修改只读属性参数
- Java进阶之反射的简单应用:通过反射运行配置文件内容
- java通过反射+注解获取两个对象改变的内容
- Java中String不可变性以及通过反射进行修改
- 使用反射机制修改JVM的DNS缓存
- 通过反射取得数组信息并修改数组内容
- java反射-通过反射机制修改对象属性
- 安装jdk1.8后,修改%JAVA_HOME%为jdk1.6的路径,但运行java -version没有变化
- Java基础笔记 – 通过反射机制修改类中的私有属性的值
- 通过Java反射在运行时修改TimerTask的执行周期并且立即生效
- 设计模式之1.1 再谈反射 以及java当中通过配置文件得到类名字,并生成对象的方法
- java更换JDK时,请记住要修改JDK的缓存
- 用java面向对象的内容建立学生姓名,学号,id,班级,每一科的成绩,以及对管理员实现(对老师只实现查看):通过名字查询成绩,通过学号查询成绩,通过id修改姓名,通过姓名修改成绩
- 通过jdk自带的jconsole.exe监控java程序的性能
- Java Swing的新进展 -- JDK1.6 Swing GTK Look&Feel