什么是连接池
看了很多相关的文章,都写得太具体了,直接讲JAVA代码……希望大侠们能从概念上讲解一下
首先不明白的是,客户端和服务端之间通过网络传输的话,无论如何也要三次握手吧?那连接池解决了什么问题呢?能避免了三次握手吗
其次连接池维护在server端还是客户端?如果在server端,每次监听客户端的请求,还是会产生一个新socket,那么维护连接池的意义何在呢?如果在客户端,似乎更没有意义?
或者说,难道连接池是一个类似于第三方代理机构的东西?客户端要连server,但不直接连,反而去连连接池,连接池保存了很多连接池和server的socket,然后随机分配一个给客户端?但这样我们还是得和连接池建立socket连接啊?
不好意思有点儿晕,怎么解释都感觉解释不通……求大神答疑
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不使用连接池:每次Http请求都会执行建立连接(tcp协议的3次握手),发送收取数据,然后断开连接。
使用连接池:第一次Http请求会建立连接,发送收取数据,然后不断开连接,将这个连接(底层的端口,线程,Socket等等的资源)保存起来,于是下次请求的时候可以重复使用……
连接池维护有两点,服务端通常默认会有一个连接超时的时间设置,客户端……就是你自己的代码控制的了。
上代码,安卓的
org.apache.http.client.HttpClient
:你可以认为,所谓的连接池其实就是对HttpClient的优化设置(保存连接而不是立刻断开)。
另外,安卓官方推荐使用
java.net.HttpURLConnection
:这种看似没有什么连接池的问题,其实是因为这个类的连接池是安卓官方实现的系统级的连接池。
好处就是不同的App应用可以共用连接池,还有省电什么的,坏处的话……我自己实测比HttpClient要慢。
UPDATE:
好吧,其实你的困惑貌似在于对Http协议的误解。
个人理解:
Http协议是一个ASCII编码的文本协议,请求头和请求主体之间用的换行符分割的,请求结束是使用Content-Length判断字节长度的。
Tcp协议是一个Byte级的协议,就比如你玩LOL,不是发个消息就断开连接了然后重新连接到服务器的……TCP有自己的连接包,断开包……
所以……
可以在同一个Tcp连接上(使用同一个Socket,同样的端口,同一个线程)执行多次Http请求……
所以……
才会有连接池这种节省资源提升效率的玩意儿。
UPDATE:
天哪,你不会是想说数据库JDBC的那种什么连接池吧=。=
连接池是维护了一堆长连接,在你需要的时候拿一个来用就行了,用完之后也不需要断开,把它还到池里,所以节省了建立SOCKET的时间
然后,在客户端维护