通过JAVA反射修改JDK1.6*当中DNS缓存内容
为了实现性能压测时的域名动态绑定功能,尝试通过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缓存内容的更多相关文章
- Java反射-修改private final成员变量值,你知道多少?
大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明. 基本数据类型 String类型 ...
- Java反射-修改字段值, 反射修改static final修饰的字段
反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...
- Java 反射修改类的常量值、静态变量值、属性值
前言 有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值. 定义一个实体类 class ...
- 【点滴积累,厚积薄发】修改hosts,并刷新dns缓存
Windows系统下hosts位置 C:\Windows\System32\drivers\etc 修改hosts后,要想马上生效,需要运行命令来刷新DNS缓存:ipconfig /flushdns
- Java反射-修改String常量
/* * ReflectString.java * Version 1.0.0 * Created on 2017年12月15日 * Copyright ReYo.Cn */ package reyo ...
- java反射修改静态方法的值setAccessible
这几天闲来无事.在网上看了一个题目,相信大家都知道这个题目 static void change(String str){ str="welcome"; ...
- java反射修改final变量
private void updateFinalModifiers(Field field) throws NoSuchFieldException, IllegalAccessException { ...
- 不藏了,这些Java反射用法总结都告诉你们
摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...
- Java反射,注解,以及动态代理
Java反射,注解,以及动态代理 基础 最近在准备实习面试,被学长问到了Java反射,注解和动态代理的内容,发现有点自己有点懵,这几天查了很多资料,就来说下自己的理解吧[如有错误,望指正] Java ...
随机推荐
- [转载] 由浅入深聊聊Golang的map
https://blog.csdn.net/u011957758/article/details/82846609 几个我忽略的点 基础 map中value的默认值 key与value的限制 valu ...
- hdoj6708 2019 CCPC网络选拔赛 1007 Windows Of CCPC
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; ch ...
- 报错PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"
今天在调用第三方HTTPS接口的时候,一直显示这个报错,然后百度很久,有2种解决方法,一个是说自己手动去导入,第二种用代码忽略证书验证.我用二种方式, 复制即用, public void test2( ...
- Vue中 关于 ‘...mapGetters’的了解
首先,我们应该知道getters是vuex中的特殊表达部分 不使用map辅助函数: computed: { test:()=> this.$store.getters.doSome } 使用ma ...
- 夯实Java基础(二十三)——Java8新特征之Stream API
1.Stream简介 Java8中除了引入了好用的Lambda表达式.Date API之外,另外还有一大亮点就是Stream API了,也是最值得所有Java开发人员学习的一个知识点,因为它的功能非常 ...
- MongoDB基础篇2:数据库/用户/数据集合的增删改
一.数据库操作 创建并进入数据库: 命令:use DATABASE_NAME 示例:use tms 查看所有数据库: 命令:show dbs 注意: (1)新创建的数据库在show dbs命令 ...
- python学习 —— seaborn、matplotlib、pandas、numpy package的混合使用
这里使用了Titanic Machine learning数据集,然后通过Seaborn的函数来拟合和绘制回归线,matplotlib进行可视化. 先来一个简单的测试: import pandas a ...
- [CMake笔记] 初识CMake
与CMake相遇 做C/C++的人都应该经历过,以往拿到一个开源代码,想自己编译出来,总会因为VS的版本不同而出现各种各样的问题,使编译过程困难重重,更多时候就会放弃使用它了.而这个过程反过来,也会使 ...
- 引入CSS的方式、link和@import的区别
引入CSS的方式有四种:内联方式.嵌入方式.链接方式.导入方式. 内联方式 内联方式指的是直接在 HTML 标签中的 style 属性中添加 CSS. <div style="back ...
- LibreOJ #6008. 「网络流 24 题」餐巾计划
这道题其实我在刚学 OI 的时候就在一本通上看见过,还记得上面写着"新餐巾一次性买完"之类的话.当时还很稚嫩(现在也是),想了好久,根本想不出来. 学了网络流之后发现这道题的图也是 ...