android/java设置DNS缓存
在通过DNS查找域名的过程中,可能会经过多台中间DNS服务器才能找到指定的域名,因此,在DNS服务器上查找域名是非常昂贵的操作。在Java中为了缓解这个问题,提供了DNS缓存。当InetAddress类第一次使用某个域名(如www.google.com)创建InetAddress对象后,JVM就会将这个域名和它从DNS上获得的信息(如IP地址)都保存在DNS缓存中。当下一次InetAddress类再使用这个域名时,就直接从DNS缓存里获得所需的信息,而无需再访问DNS服务器。DNS缓存在默认时将永远保留曾经访问过的域名信息,但我们可以修改这个默认值。一般有两种方法可以修改这个默认值:
1. 在程序中通过java.security.Security.setProperty方法设置安全属性networkaddress.cache.ttl的值(单位:秒)。如下面的代码将缓存超时设为10秒:
java.security.Security.setProperty("networkaddress.cache.ttl", 10);
2. 设置java.security文件中的networkaddress.cache.negative.ttl属性。假设JDK的安装目录是C:\jdk1.6,那么java.security文件位于c:\jdk1.6\jre\lib\security目录中。打开这个文件,找到networkaddress.cache.ttl属性,并将这个属性值设为相应的缓存超时(单位:秒)。
如果将networkaddress.cache.ttl属性值设为-1,那么DNS缓存数据将永远不会释放。下面的代码演示了使用和不使用DNS缓存所产生效果:
package mynet;import java.net.*;publicclass MyDNS{ publicstaticvoid main(String[] args) throws Exception { // args[0]: 本机名 args[1]:缓冲时间if (args.length <2) return; java.security.Security.setProperty("networkaddress.cache.ttl", args[1]); long time = System.currentTimeMillis(); InetAddress addresses1[] = InetAddress.getAllByName(args[0]); System.out.println("addresses1: "+ String.valueOf(System.currentTimeMillis() - time) +"毫秒"); for (InetAddress address : addresses1) System.out.println(address); System.out.print("按任意键继续"); System.in.read(); time = System.currentTimeMillis(); InetAddress addresses2[] = InetAddress.getAllByName(args[0]); System.out.println("addresses2: "+ String.valueOf(System.currentTimeMillis() - time) +"毫秒"); for (InetAddress address : addresses2) System.out.println(address); }}package mynet;import java.net.*;publicclass MyDNS1{ publicstaticvoid main(String[] args) throws Exception { java.security.Security.setProperty("networkaddress.cache.negative.ttl", "5"); long time =0; try { time = System.currentTimeMillis(); InetAddress.getByName("www.ppp123.com"); } catch (Exception e) { System.out.println("www.ppp123.com不存在! address1: "+ String.valueOf(System.currentTimeMillis() - time) +"毫秒"); } //Thread.sleep(6000); // 延迟6秒try { time = System.currentTimeMillis(); InetAddress.getByName("www.ppp123.com"); } catch (Exception e) { System.out.println("www.ppp123.com不存在! address2: "+ String.valueOf(System.currentTimeMillis() - time) +"毫秒"); } }}