线上服务器报错:
org.apache.solr.client.solrj.SolrServerException: IOException occured when talking to server at: http://127.0.0.1:8983/solr/harvewifi
Caused by: java.net.NoRouteToHostException: Cannot assign requested address
初步猜测是因为httpsolrclient 每次都会new一个新的出来,将端口占用了。
Linux下输入命令,可以查看可以使用的端口号范围:
cat /proc/sys/net/ipv4/ip_local_port_range
32768 - 61000
可见只有三万多个。
在本机上测试:
for(int i = 0; i < 65000; ++i){
System.out.println(i);
SolrDocumentList solrDocumentList = solrDao.getResults(query);
}
输出16299后就报错了:
org.apache.solr.client.solrj.SolrServerException: IOException occured when talking to server at: http://192.168.75.101:8983/solr/harvewifi
网上说windows下可用的端口号为:1024 - 65535
使用命令查看当前使用的端口号:netstat -a -n
发现当前起步就从59000多开始往上加,加到65000多就完了,刚好16000多点。
因此可以断定,就是过多的httpsolrclient 占用端口导致的出错。
解决方案:
1.用完httpsolrclient 调用其close方法将其关闭
但同时要注意,端口此时为TIME_WAIT状态,默认60秒内才会释放,如果并发量太大还是会有问题,可以设置系统的TIME_WAIT的时间。
2.在dao层使用
@Resource
private HttpSolrClient httpSolrClient;
这样就只有一个httpsolrclient,不要去动态new它。