概述
连接池的作用就是为了提高性能,将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对Server端进行访问。这样 省略了创建连接和销毁连接的过程(TCP连接建立时的三次握手和销毁时的四次握手) ,从而在性能上得到了提高。小编推荐大家加一下这个群:330637182 这个群里好几千人了!大家遇到啥问题都会在里面交流!而且免费分享零基础入门料资料web开发 爬虫资料一整套!是个非常好的学习交流地方!也有程序员大神给大家热心解答各种问题!很快满员了。欲进从速哦!各种PDF等你来下载!全部都是免费的哦!所以小编在群里等你们过来一起交流学习呢!
DBUtils.PooledDB使用DB-API 2模块实现了一个强硬的、线程安全的、有缓存的、可复用的数据库连接。
如下图展示了使用PooledDB时的工作流程:
而获取连接的过程正如之前讨论的,先从连接池中获取连接,如果获取连接失 败,则新建立连接:
RabbitMQ队列插入消息连接池
异步消息传递是高并发系统常用的一种技术手段。而这其中就少不了消息队列。频繁的向消息队列里面插入消息,建立连接释放连接会是比较大的开销。所以,可以使用连接池来提高系统性能。
连接池的设计实现如下:
一个RabbitMQ插入消息队列的完整连接池设计如下:
Thrift连接池
Thrift是什么呢?简而言之,Thrift定义一个简单的文件,包含数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的方式。实际上就是一种远程调用的方式,因为协议栈为TCP层,所以相对于HTTP层效率会更高。
Thrift连接池的设计同数据库连接池类似,流程图如下:
思路依旧是,在获取连接时,先从连接池中获取连接,若池中无连接,则判断是否可以新建连接,若不能新建连接,则阻塞等待连接。
在从池中获取不到队列的时候的处理方式,本设计处理方式为: 当获取不到连接时,将这部分请求放入一个等待队列,等待获取连接;而当关闭连接放回连接池时,优先判断这个队列是否有等待获取连接的请求,若有,则优先分配给这些请求 。
获取不到连接时处理代码如下,将请求放入一个队列进行阻塞等待获取连接:
最后,基于thrift连接池,介绍一个简单的服务化框架的实现。
服务化框架分为两部分:RPC、注册中心。
1、RPC:远程调用,远程调用的传输协议有很多种,可以走http、Webservice、TCP等。Thrift也是世界上主流的RPC框架。其重点在于安全、快速、最好能跨语言。
2、注册中心:用于存放,服务的IP地址和端口信息等。比较好的存放服务信息的方案有:Zookeeper、Redis等。其重点在于避免单点问题,并且好维护。
通常的架构图为:
通过Thrift连接池作为客户端,而Zookeeper作为注册中心,设计服务框架。具体就是 服务端在启动服务的时候到Zookeeper进行注册,而客户端在启动的时候通过Zookeeper发现服务端的IP和端口,通过Thrift连接池轮询建立连接访问服务端的服务 。
具体设计的代码如下,代码有点长,细细研读一定有所收获的: