我正面临着JVM和DNS的问题.
我正在阅读的所有内容(包括文档和此内容)都说我可以使用networkaddress.cache.ttl可以设置的JVM DNS缓存java.security.Security.setProperties,但是可以通过使用系统属性的标准方法来设置.我已成功将其更改为0,因此我的JVM中不再有缓存.
但是现在,在每次调用时InetAddress.getByName("mytest.com"),似乎我的JVM正在使用系统 DNS缓存(在我的情况下是Windows 8).实际上,在方法的两次调用之间,我已经更改了"mytest.com"的BIND9属性,但IP返回仍然是相同的.这是工作流程:
setCachePolicyInJVM(0) 在我的Java代码中.mytest.com为192.168.1.在BIND9中188,重启.InetAddress.getByName("mytest.com").getHostAddress(); - > 192.168.1.188mytest.com- > 192.168.1.在BIND9 160,重启.InetAddress.getByName("mytest.com").getHostAddress(); - > 192.168.1.188(如果没有缓存,则应为160).InetAddress.getByName("mytest.com").getHostAddress(); - > 192.168.1.160我已多次读过JVM不使用系统缓存,但这是错误的:它显然是这样.
我们如何绕过操作系统 DNS缓存强制每次调用新的DNS解析?
在我处理DNS的第一篇文章之后,仍未解决:JVM和OS DNS缓存 ,我正面临一个新问题.
首先是我的用例:我想检查我的私有DNS是否还活着.如果不是,我想使用一般DNS(例如8.8.8.8).
我的私有DNS(ubuntu上的bind9与192.168.1.188)作为特定记录:test.testdnd.fr - > 192.168.1.100
所以我想我能做到这一点:
if(InetAddress.getByAddress(my_dns_ip_in_byte).isReachable()){
System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");
System.setProperty("sun.net.spi.nameservice.nameservers", 192.168.1.188);
}else{
System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");
System.setProperty("sun.net.spi.nameservice.nameservers", "8.8.8.8");
}
InetAddress.getHostByAddress(test.testdnd.fr) -> unknow host exception
Run Code Online (Sandbox Code Playgroud)
但如果我只做:
System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");
System.setProperty("sun.net.spi.nameservice.nameservers", 192.168.1.188);
InetAddress.getHostByAddress(test.testdnd.fr) -> 192.168.1.100
Run Code Online (Sandbox Code Playgroud)
因此,一旦我在设置system.property之前调用了InetAddress方法,似乎system.property没有任何效果.也许是因为JVM在调用InetAddress方法时加载系统DNS值,即使它不使用DNS解析.
这是JVM中的标准行为还是我失去了什么?
欢迎任何帮助,
我正在使用inno setup安装我的软件(myprog.exe),我想强制用户启动myprog.exe作为管理员,但我无法弄清楚!我的exe在图标上没有uac盾牌,它可以在没有"右键单击"的情况下启动 - "以管理员身份运行"
我为安装程序设置了PrivilegesRequired = admin,但我只是为了安装阶段.
事实上,我想告诉Windows"嘿,我的程序是危险的,allays要求以管理员身份运行它"
有任何想法吗?