底层是HttpURLConnection。
连接池跟随系统:
JDK自带的HttpURLConnection,默认启用keepAlive,支持HTTP / 1.1和HTTP / 1.0持久连接, 使用后的HttpURLConnection会放入缓存中供以后的同host:port的请求重用,底层的socket在keepAlive超时之前不会关闭。
HttpURLConnection受以下system properties控制:http.keepAlive=<boolean>(默认值:true)
,是否启用keepAlive,如果设置为false,则HttpURLConnection不会缓存,使用完后会关闭socket连接。http.maxConnections=<int>(默认值:5)
,每个目标host缓存socket连接的最大数。
1、如果在HttpURLConnection的header中加入Connection: close,则此连接不会启用keepAlive
2、想要启用keepAlive,程序请求完毕后,必须调用HttpURLConnection.getInputStream().close()(表示归还长连接给缓存,以供下次同host:port的请求重用底层socket连接)
,而不能调用HttpURLConnection.disconnect()(表示关闭底层socket连接,不会启用keepAlive)
3、keepAliveTimeout首先从http response header中获取,如果没有取到,则默认为5秒,sun.net.www.http.KeepAliveCache.java中有一个线程,每5秒执行一次,检查缓存的连接的空闲时间是否超过keepAliveTimeout,如果超过则关闭连接。从KeepAliveCache中获取缓存的连接时也会检查获取到的连接的空闲时间是否超过keepAliveTimeout,如果超过则关闭连接,并且获取下一个连接,再执行以上检查,直达获取到空闲时间在keepAliveTimeout以内的缓存连接为此。