差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 | ||
java:basic:networking:resolve_host_cache_on_suse [2017/01/19 17:06] tony [Reference] |
java:basic:networking:resolve_host_cache_on_suse [2023/06/25 09:48] (目前版本) |
||
---|---|---|---|
行 4: | 行 4: | ||
為了要做某個測試,我們會去修改/etc/hosts的內容,讓某個hostname會對應到ip A;但結果卻是對應到ip B,也是此hostname真實的ip。 | 為了要做某個測試,我們會去修改/etc/hosts的內容,讓某個hostname會對應到ip A;但結果卻是對應到ip B,也是此hostname真實的ip。 | ||
===== How to resolve? ===== | ===== How to resolve? ===== | ||
- | 在SUSE上,有一個名為nscd的name service cache,其中一個功能就是會cache /etc/hosts的查詢結果。在爬些文後,得知只要執行以下指令,就可以清除/etc/hosts的cache: | + | 首先我有確認/etc/host.conf確認搜尋hostname順序;後來得知在SUSE上,有一個服務名為nscd提供name service cache,其中一個功能就是會cache /etc/hosts的查詢結果。在爬些文後,得知只要執行以下指令,就可以清除/etc/hosts的cache: |
<code bash> | <code bash> | ||
/usr/sbin/nscd -i hosts | /usr/sbin/nscd -i hosts | ||
</code> | </code> | ||
+ | 實際測試後發現,依然會存在大概20秒左右的cache;於是我想: 這應該是JVM的cache。後來嘗試了兩種做法,並搭配清除hosts cache的指令,就可以做到立即反映結果。第一個方法是透過程式寫入: | ||
+ | <code java> | ||
+ | java.security.Security.setProperty("networkaddress.cache.ttl", "0"); | ||
+ | </code> | ||
+ | 第二個方法,是在啟動參數加入: | ||
+ | <code bash> | ||
+ | -Dsun.net.inetaddr.ttl=0 | ||
+ | </code> | ||
+ | 如此就可以順利測試完成。\\ | ||
+ | \\ | ||
+ | 目前已知問題是,如果停止了nscd服務後,即使你修改了/etc/hosts,hostname依然會維持在上次query的狀況下。 | ||
===== Reference ===== | ===== Reference ===== | ||
* [[https://linux.die.net/man/5/nscd.conf|About nscd]] | * [[https://linux.die.net/man/5/nscd.conf|About nscd]] | ||
* [[https://www.liquidweb.com/kb/flush-dns-cache/|flush dns cache]] | * [[https://www.liquidweb.com/kb/flush-dns-cache/|flush dns cache]] | ||
* [[http://www.ctolib.com/topics/61570.html|java实现清理DNS Cache的方法]] | * [[http://www.ctolib.com/topics/61570.html|java实现清理DNS Cache的方法]] | ||
+ | * [[http://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html|Java7 - networking properties]] | ||
+ | * [[http://www.study-area.org/2freebsd/config/02.htm|/etc/host.conf]] | ||
+ | |||
+ | ===== ===== | ||
+ | ---- | ||
+ | \\ | ||
+ | ~~DISQUS~~ | ||