
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了入门程序员需要掌握的一些基础知识等内容,而本文我们就再来学习一下,Java编程连接池技术应用分析。
一、连接
什么是连接?
连接,代表上游对下游的通信或会话。比如客户端连接服务器、服务器连接数据存储等
连接其通信的基本步骤,很类似HTTP操作:
上游对下游建立一个连接(客户端与服务器需要建立连接。比如点击某个超级链接)
上游通过连接,发送请求(建立连接后,客户端发送请求给服务器)
上游通过连接,收到响应(服务器接到请求后,响应其响应信息)
上游关闭连接,释放连接资源(客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接)
再深入点,HTTP持久连接是什么?HTTP持久连接是指用同一个HTTP底层的TCP连接来发送/接收多个HTTP请求/响应。扩展点,只需要在头部设置:
Connection:Keep-Alive
为什么要有持久连接?每次都是从建立连接开始也可以达到结果,并且后是关闭连接释放资源。这就是引出连接池产生原因。
二、连接池产生原因
先看一下常见的mysql-connector-java包驱动下面ConnectionImpl源码:
trackConnection()
execSQL()
commit()
close()
对MySQL多半是进行连接(connection),增删改查并提交(execSQL、commit),关闭连接(close)操作,然后实现业务相关逻辑。其操作也很清晰:
建立连接
发送请求(数据的CRUD操作)
关闭连接
但,为啥会需要有连接池?
其实在业务量流量不大,并发量也不大的情况下,连接临时建立完全可以。
但并发量起来,达到百级、千级,其中建立连接、关闭连接的操作会造成性能瓶颈,所以得考虑连接池来优化上述1和3操作:
取出连接(业务服务启动时,初始化若干个连接,放在连接存储中)
发送请求(当有请求,从连接存储中中取出)
放回连接(执行完毕,连接放回连接存储中)
这里对连接存储的数据结构,并维护连接,就是连接池。
三、连接池实现原理
连接池原理,可以具体看下阿里巴巴Druid包的DruidDataSource源码:
DruidConnectionHolder[]connections;
createConnection()
getConnection()
recycle()
连接池实现原理也不难,DruidDataSource即德鲁伊连接池,可以核心设计接口:
createConnection:服务启动init,会创建一批指定数量的连接放入connections数组
getConnection:这样每次请求,不会新建一个连接。而是从DruidConnectionHolder[]connections数组中取出一个连接
recycle:每次请求结束后,不是关闭连接,而是回收连接到connections数组
其中有个重入锁ReetrantLock,具体作用如下:
获取一个连接,锁住
返回该连接,使用连接
使用完毕,回收连接,并释放锁
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。