时间 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反射修改JDK1.6*当中DNS缓存内容的更多相关文章

  1. Java反射-修改private final成员变量值,你知道多少?

    大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明.  基本数据类型 String类型 ...

  2. Java反射-修改字段值, 反射修改static final修饰的字段

    反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...

  3. Java 反射修改类的常量值、静态变量值、属性值

    前言 有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值. 定义一个实体类 class ...

  4. 【点滴积累,厚积薄发】修改hosts,并刷新dns缓存

    Windows系统下hosts位置 C:\Windows\System32\drivers\etc 修改hosts后,要想马上生效,需要运行命令来刷新DNS缓存:ipconfig /flushdns

  5. Java反射-修改String常量

    /* * ReflectString.java * Version 1.0.0 * Created on 2017年12月15日 * Copyright ReYo.Cn */ package reyo ...

  6. java反射修改静态方法的值setAccessible

    这几天闲来无事.在网上看了一个题目,相信大家都知道这个题目  static void change(String str){         str="welcome";     ...

  7. java反射修改final变量

    private void updateFinalModifiers(Field field) throws NoSuchFieldException, IllegalAccessException { ...

  8. 不藏了,这些Java反射用法总结都告诉你们

    摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...

  9. Java反射,注解,以及动态代理

    Java反射,注解,以及动态代理 基础  最近在准备实习面试,被学长问到了Java反射,注解和动态代理的内容,发现有点自己有点懵,这几天查了很多资料,就来说下自己的理解吧[如有错误,望指正] Java ...

随机推荐

  1. Babel的安装和使用

    安装Node.JS 和 npm,如未安装可参照其他文章 1.创建一个package.json npm init (回车, 一直下一步即可) 安装 Babel npm install --save-de ...

  2. lc 0228

    目录 ✅ 412. Fizz Buzz 描述 解答 c数字转字符: other's c my c tdo py ✅ 235. 二叉搜索树的最近公共祖先 描述 解答 评价者 思路: c py ✅ 412 ...

  3. 设计模式课程 设计模式精讲 3-8 迪米法特原则讲解及Coding

    1 课程讲解 1.1 定义 1.2 特质 1.3 重点 2 代码演练 2.1 反例 2.2 正例 1 课程讲解 1.1 定义 定义:一个对象应该对其他对象保持最少的了解.又叫最少知道原则. 1.2 特 ...

  4. 软件架构,WEB - REST架构,RESTful API

    参考 https://www.zhihu.com/question/27785028/answer/48096396 wiki太学术化了 http://www.ruanyifeng.com/blog/ ...

  5. 07 DTFT

    DTFT 连续时间傅里叶变换(CTFT) 连续时间傅里叶变换的定义为: \[ X(j\Omega)=\int_{-\infty}^{\infty}x_a(t)e^{-j\Omega t}dt \] 其 ...

  6. day1-4js算术运算符及类型转化

    一,JS的运行环境 在html中使用JS,浏览器去解析 NodeJS环境内封装了JS的解析器 二,JavaScript的特点 1.客户端执行 2.执行顺序自上而下 3.弱类型(数据类型)语言 var ...

  7. 【转】Chrome开发者工具详解

    https://www.jianshu.com/p/7c8552f08e7a Chrome开发者工具详解(1)-Elements.Console.Sources面 Chrome开发者工具详解(2)-N ...

  8. gensim加载词向量文件

    # -*- coding: utf-8 -*- # author: huihui # date: 2020/1/31 7:58 下午 ''' 根据语料训练词向量,并保存向量文件 ''' import ...

  9. 转--Spring MVC : Java模板引擎 Thymeleaf (三)

    原文:http://www.csdn.com/html/topnews201408/49/1349.htm 下面以构造一个表单开始,讲解 Thymeleaf的用法.为了演示方便,还是以经典的注册为例. ...

  10. 「Luogu P1383 高级打字机」

    一道非常基础的可持久化数据结构题. 前置芝士 可持久化线段树:实现的方法主要是主席树. 具体做法 这个基本就是一个模板题了,记录一下每一个版本的字符串的长度,在修改的时候就只要在上一个版本后面加上一个 ...