抛出java.net.UnknownHostException时检查/设置超时的位置?

抛出java.net.UnknownHostException时检查/设置超时的位置?,java,tomcat,httpurlconnection,Java,Tomcat,Httpurlconnection,抛出java.net.UnknownHostException时检查/设置超时的位置 有时,我的代码尝试连接到一个不存在的位置,并抛出java.net.UnknownHostException我的应用程序中可以接受的情况 我遇到的问题是,抛出异常大约需要20秒,这会减慢整个应用程序的速度 Web服务器版本是Tomcat 7.0.37。我已尝试在server.xml中更改以下连接器的超时设置(为2sec): Connector port="8009" protocol="AJP/1.3" redi

抛出java.net.UnknownHostException时检查/设置超时的位置

有时,我的代码尝试连接到一个不存在的位置,并抛出java.net.UnknownHostException我的应用程序中可以接受的情况

我遇到的问题是,抛出异常大约需要20秒,这会减慢整个应用程序的速度

Web服务器版本是Tomcat 7.0.37。我已尝试在server.xml中更改以下连接器的超时设置(为2sec):

Connector port="8009" protocol="AJP/1.3" redirectPort="8443" connectionTimeout="2000"
Connector port="8080" protocol="HTTP/1.1" connectionTimeout="2000" redirectPort="8443"
当我使用HttpURLConnection时,我希望端口8080的连接超时设置生效,但它似乎不是真的

我还尝试在代码中设置超时:

HttpURLConnection connection = (HttpURLConnection)url.openConnection();  
connection.setConnectTimeout(1000);  
Reader reader= new InputStreamReader((InputStream) connection.getContent());
但这也不行,有什么想法吗?我错过什么了吗


ta

可能是在DNS中查找主机,在您的情况下,在尝试查找找不到的主机时,DNS似乎超时。如果您连接到的DNS服务器将请求转发到另一个DNS服务器,并且在合理的时间内没有得到答复,则可能是因为该服务器配置不好,因此会发生这种情况

您可以通过提前设置DNS查找超时,在操作系统级别解决此问题;例如,在Linux中,您可以将
选项timeout:2
添加到
/etc/resolv.conf
以使DNS查找超时时间为2秒,而不是默认值。在Windows上,您必须

或者,您可以通过以下方式在程序中解决此问题。如果线程在指定的超时时间内没有返回,则假定名称解析将抛出
未知hostException


第三种选择是使用不同的、性能更好的DNS服务器,如Google在8.8.8.8和4.4.4.4中维护的DNS服务器。

您面临的问题是DNS解析问题,而不是Java问题,我猜您的程序在DNS查询期间被阻止。尝试在shell中的未知主机上执行nslookup,以查看是否重现该问题。如果是,请让系统管理员查看DNS服务器日志和配置,以防出现问题

如果主机经常是相同的,请参阅本文,将负ttl配置为缓存来自DNS的未知主机响应:

您通常使用的是慢速互联网连接吗?如果是,您是否尝试增加超时?尝试在高速连接上测试它。如果问题仍然存在,则说明您的逻辑中存在一些问题,可能会产生太多线程。您的DNS配置错误。解决这个问题。@user927258增加超时时间将如何帮助我减少等待抛出java.net.UnknownHostException所花费的时间?@EJP这将由网络管理员决定,而不是在我的权限范围内,我必须在我的应用程序中解决这个问题,taThanks对于这个想法,在我看来这确实是DNS的问题。合计默认时间DnsQueryTimeout(在“编辑注册表设置”一文中给出)会得到17秒,这可以解释为什么我在调用不可用主机时等待大约那个时间的操作。还有一个选项是如果可以的话,使用不同的DNS服务器。8.8.8.8(由谷歌维护)速度非常快,不会让你等着告诉你他们是否无法解析名字。仔细想想,我会在答案中加上这个。