HttpUrlConnection使用之后是否需要disconnet()

现在用的最多的都是http连接池,看其他帖子连接池性能更好些,老代码中jdk原生的http请求出问题时也是需要定位修复的,
一个比较原生和请求池性能的帖子:https://blog.csdn.net/u011479540/article/details/51918474
1.如果代码没有什么异常在获取使用完流之后,关闭流,http连接会自动被关闭
2.如果http连接超时,或者读取数据连接socket超时,没有获取到流,此时需要主动关闭http(disconnet())
总结:
如果使用了HttpUrlConnection进行http请求,
1.最好在finally中加disconnet(),以防异常时候http连接未被关闭,造成tcp连接堆积
2.并且要设置连接和读取超时时间,否则程序会一直卡在获取流这一步

(记一次生产事故,因为是新人需要维护之前的老代码,所以很多小坑小洼难免不易发现,如下代码原未设置超时时间及断连,在某个下层应用提供url有问题后,http连接出问题,从早晨开始陆续有商户反应支付请求变慢,因为服务运行半年平稳无事故,开始以为是公司网络受到攻击,后续通过分析日志发现是此url请求不通未做处理导致程序卡顿,tcp连接堆积,服务器只有5M带宽,网络就变慢了!!!)
import java.net.HttpURLConnection;
public static String sendGET(String getAccessTokenUrl){
StringBuffer openJsonStr = new StringBuffer();
InputStream inputStream = null;
BufferedReader in =null;
HttpURLConnection httpURLConnection =null;
try {
httpURLConnection = HttpClientUtil.getHttpURLConnection(getAccessTokenUrl);
httpURLConnection.setConnectTimeout(30000); // 设置连接主机超时(单位:毫秒) 开始未设置
httpURLConnection.setReadTimeout(30000); // 设置从主机读取数据超时(单位:毫秒) 开始未设置
inputStream = httpURLConnection.getInputStream();
in = new BufferedReader(new InputStreamReader(inputStream, Constant.DEFAULT_CHARSET));
String lines="";
while((lines = in.readLine()) != null){
openJsonStr.append(lines);
}
} catch (IOException e) {
log.error(e.getMessage());
}catch (Exception e) {
log.error(e.getMessage());
}
finally{
if(in!=null){
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

		if(inputStream!=null){

			try {
				inputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if (httpURLConnection != null) {
			 try {
				  httpURLConnection.disconnect();  // 开始未设置
			  } catch (Exception e) {
				  e.printStackTrace();
			  }
		  }
	  }
	  
	  return openJsonStr.toString();
}

测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {“classpath:spring.xml”, “classpath:spring-mybatis.xml”, “classpath:spring-redis.xml”, “classpath:spring-face.xml”})
@ActiveProfiles(“test”)
public class AndroidFaceTest {
@Test
public void testGetHttp(){
PayHelper.sendGET(“http://39.106.131.159/add.php”);
}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值