在之前的
一篇文章 中,介绍了mongos的balaner的 执行流程,其中在源码中的Balancer::run()方法里简单说明了为了连接到configserver,balancer通过构造 ScopedDbConnection实现来链接并执行相应操作,因为当时篇幅所限,只是该链接使用池化的方式一带而过,今天就专门介绍一下 mongodb中使用池化方式来管理链接对象以提升链接效率的原理。
好了,开始今天的正文吧!
首先看一下balancer类的run()方法,相关代码如下:
上面方法中从ScopedDbConnection声明到该实现执行done()方法结束,系统会从链接池中获取一个链接对象,如无链接则直接创建。如 果是创建的链接,则会将该链接添加到池中。下面我们就看一下其类图:
好了,开始今天的正文吧!
首先看一下balancer类的run()方法,相关代码如下:
图中的红框所圈的类均为connpool.h头文件中所包含定义的类信息,而这些类中(比如ScopedDbConnection,上面代码提到过)会 包含一个DBClientBase属性指针,而DBClientBase的定义位于dbclient.h头文件中,其主要是定义了客户端连接到 mongodb服务端时所经常进行的操作(CRUD等)。
图中的类比较多,主要的几个包括:
ScopedDbConnection: 池中的数据库链接类,其通过持有的DBClientBase指出针来施加crud操作
DBConnectionPool:数据库链接池 类,定义链接的创建,获取,flush,以及维护等操作。
PoolForHost:该对象提供以栈式(stack)方式管理pool链接 对象。
DBConnectionPool:数据库链接池 类,定义链接的创建,获取,flush,以及维护等操作。
PoolForHost:该对象提供以栈式(stack)方式管理pool链接 对象。
下面就先看一下ScopedDbConnection的构造方法,其执行流程如下: