<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    心有多大舞臺便有多大

    Embrace changes, pursue excellence, share niceness.

    java InetAddress 的dns cache問題

    jdk的InetAddress有一個特性,就是當系統(tǒng)訪問過一個域名的時候,InetAddress就會通過其私有變量addressCache把域名對應的ip地址緩存起來.
    雖然緩存起來能極大的提高系統(tǒng)性能,但有時候會給系統(tǒng)帶來很大的麻煩.例如,當對方改動了ip地址后,系統(tǒng)就不能再訪問到新的ip地址了,這個時候最直接的方案就是:重啟jvm!!!這對于需要7*24小時服務的系統(tǒng)來說,是不可忍受的.
    下面一段代碼可以重現(xiàn)這個現(xiàn)象(但需要你在運行的時候是在調(diào)試模式):
    public void testDnsCachePolicy() throws Exception {
            InetAddress addr1 = InetAddress.getByName("         System.out.println(addr1.getHostAddress());
            //在下一行設置斷點.
            int i = 0;
            InetAddress addr2 = InetAddress.getByName("
            System.out.println(addr2.getHostAddress());
    }
    具體測試方式是:
    1.修改c:/windows/system32/drivers/etc/hosts文件,在文件末尾加入:64.233.189.104    
    www.baidu.com
    這個ip地址是google的ip
    2.運行代碼到斷點處
    這時候打印出的ip地址是64.233.189.104
    3.修改hosts文件,把"64.233.189.104     4.繼續(xù)運行代碼到結束
    這時候打印出的ip地址還是64.233.189.104,并沒有更改為baidu的ip地址.

    那么應該怎么來解決這個問題呢?
    查了下網(wǎng)上的解決方案,一般是在啟動jvm的時候,指定jvm參數(shù):networkaddress.cache.ttl和networkaddress.cache.negative.ttl,具體的含義你可以查看InetAddress的源代碼.
    這種方法的缺點是在JVM啟動的時候就固定了dns的緩存策略.如果不緩存的話,對系統(tǒng)性能的影響是很大的,那么能不能動態(tài)的修改這個緩存的值呢?
    正好前段時間寫了篇文章:怎么通過反射修改類的私有字段值.正好有了用武之地!
    下面是測試代碼:
    //方法中的字符串常量policy,cache,addressCache請參考InetAddress源代碼.
    public void testDnsCachePolicy() throws Exception {
            InetAddress addr1 = InetAddress.getByName("
            System.out.println(addr1.getHostAddress());
             //在下一行設置斷點.
            int i = 0;
            //修改緩存數(shù)據(jù)開始
            Class inetAddressClass = java.net.InetAddress.class;       
            final Field cacheField = inetAddressClass.getDeclaredField("addressCache");       
            cacheField.setAccessible(true);       
            final Object obj = cacheField.get(inetAddressClass);       
            Class cacheClazz = obj.getClass();       
            final Field cachePolicyField = cacheClazz.getDeclaredField("policy");       
            final Field cacheMapField = cacheClazz.getDeclaredField("cache");       
            cachePolicyField.setAccessible(true);
            cacheMapField.setAccessible(true);    
            final Map cacheMap = (Map)cacheMapField.get(obj);
            cacheMap.remove("
            //修改緩存數(shù)據(jù)結束
            InetAddress addr2 = InetAddress.getByName("
            System.out.println(addr2.getHostAddress());
    }
    重新按照上面的測試方法測試一次,第2次已經(jīng)能夠拿到正確的ip地址了.

    如果在用apache的httpclient,那么,在把緩存中的數(shù)據(jù)清除后,需要重新創(chuàng)建GetMethod/PostMethod對象.
    例如:
    HttpClient client = new HttpClient();
    GetMethod m1 = new GetMethod("http://www.baidu.com");
    client.executeMethod(m1);
    String content = m1.getResponseBodyAsString();
    ........//通過上面的反射方法清楚緩存
    //重新執(zhí)行m1,仍然不會得到正確的結果
    client.executeMethod(m1);
    String content = m1.getResponseBodyAsString();
    //重新創(chuàng)建GetMethod,才能得到正確的結果
    GetMethod m2 = new GetMethod("http://www.baidu.com");
    client.executeMethod(m2);
    content = m2.getResponseBodyAsString();

    posted on 2008-07-09 15:57 pony 閱讀(4717) 評論(3)  編輯  收藏 所屬分類: Java

    評論

    # re: java InetAddress 的dns cache問題 2008-12-24 16:36 路人

    太感謝樓主了,正好遇到這個問題  回復  更多評論   

    # re: java InetAddress 的dns cache問題 2011-06-29 19:55 private250

    樓主高人!向你致敬!  回復  更多評論   

    # re: java InetAddress 的dns cache問題 2015-04-24 22:35 Jerry Lee

    寫了操作Java DNS Cache的庫 https://github.com/alibaba/java-dns-cache-manipulator ,可以方便些設置/重置/清空JVM DNS,支持 JDK 6 7 8。可以試試 ~   回復  更多評論   

    主站蜘蛛池模板: 亚洲无人区一区二区三区| 免费在线观看日韩| 亚洲最新永久在线观看| 成人精品视频99在线观看免费| 亚洲国产精品自产在线播放| 黄色毛片免费网站| 国产午夜亚洲不卡| 国产线视频精品免费观看视频| 成人午夜亚洲精品无码网站| 精品人妻系列无码人妻免费视频| 亚洲一区日韩高清中文字幕亚洲 | 亚洲人成电影网站久久| 中字幕视频在线永久在线观看免费| 亚洲va成无码人在线观看| 午夜网站免费版在线观看| 日韩精品亚洲专区在线影视| 亚洲 综合 国产 欧洲 丝袜| 9久久免费国产精品特黄| 亚洲欧洲免费视频| 在线永久看片免费的视频| 亚洲欧洲无码AV不卡在线| 国产精品免费视频网站| 精品无码国产污污污免费网站国产 | 亚洲免费黄色网址| 亚洲国产成人精品激情| 国产一区二区三区免费视频| eeuss草民免费| 亚洲国产成人综合| 又大又硬又爽免费视频| 免费一区二区无码东京热| 亚洲国产精品无码久久久| 四虎免费永久在线播放| 国产在线精品一区免费香蕉| 亚洲日韩国产精品无码av| 又黄又爽一线毛片免费观看 | 免费看国产精品3a黄的视频| 麻豆va在线精品免费播放| 久久亚洲国产精品五月天| 日韩中文字幕免费| 一个人看的www免费视频在线观看| 精品久久亚洲中文无码|