TEMPERANCE:Eat not to dullness;drink not to elevation. 节制:食不过饱,饮不过量。
什么是连接? 连接,代表上游对下游的通信或会话。比如客户端连接服务器、服务器连接数据存储等
连接其通信的基本步骤,很类似 HTTP 操作:
再深入点,HTTP 持久连接是什么?HTTP 持久连接是指用同一个 HTTP 底层的 TCP 连接来发送/接收多个 HTTP 请求/响应。扩展点,只需要在头部设置:
Connection: Keep-Alive
为什么要有持久连接?每次都是从建立连接开始也可以达到结果,并且最后是关闭连接释放资源。这就是引出连接池产生原因。
先看一下常见的 mysql-connector-java 包驱动下面 ConnectionImpl
源码:
trackConnection()
execSQL()
commit()
close()
对 MySQL 多半是进行连接(connection),增删改查并提交(execSQL、commit),关闭连接(close)操作,然后实现业务相关逻辑。其操作也很清晰:
但,为啥会需要有连接池? 其实在业务量流量不大,并发量也不大的情况下,连接临时建立完全可以。 但并发量起来,达到百级、千级,其中建立连接、关闭连接的操作会造成性能瓶颈,所以得考虑连接池来优化上述 1 和 3 操作:
这里对连接存储的数据结构,并维护连接,就是连接池。
连接池原理,可以具体看下阿里巴巴 Druid 包的 DruidDataSource
源码:
DruidConnectionHolder[] connections;
createConnection()
getConnection()
recycle()
连接池实现原理也不难,DruidDataSource 即德鲁伊连接池,可以核心设计接口:
其中有个重入锁 ReetrantLock,具体作用如下:
核心连接池也就这么点东西,具体还需要考虑其他点如下:
-The End-