实现原理
- 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。
- 连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
- 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
过程
在系统初始化阶段,创建一定数量的数据库连接对象(connection)),并将这些对象存储在连接池(connection pool)中(对应某种类型的容器,如 list )。当有数据库连接请求时,就从连接池中取出一个数据库连接;如果此时连接池中的数据库连接已经用完了,并且当前的连接数还没有达到连接池定义的最大连接数时,则可再创建一个新的连接,而如果当前的连接数已达到最大连接数时,就要等待其他连接请求释放连接、连接池中存在空闲连接时才能获取连接。当一个连接请求使用完连接时,必须将该连接放回到连接池中,这样不同的数据库访问请求就可以共享连接池中的连接了。通过重复使用连接池中的数据库连接,可以避免前面提到的频繁建立连接的缺点,提高了数据库的性能。
现在,我们把上述描述拆分为以下几步,便于更清晰地认识数据库连接池的工作原理:
-
当服务启动时,建立一个数据库连接池对象;
-
初始化一定数量的数据库连接,放入连接池对象的容器中;-当 有数据库访问请求时,直接从连接池的容器中获取一个连接,这里连接池中是否仍有空闲连接,存在以下三种情况:
- 当容器中的还有空闲连接时,则分配给数据库访问请求者一个连接
- 当容器中没有空闲连接时,并且当前已建立的连接数没有达到连接池定义的最大连接数时,则需要创建一个新的数据库连接,并将该连接分配给数据库访问请求者
- 当容器中的没有空闲连接,并且当前已建立的连接数达到了连接池定义的最大连接数时,则当前数据库访问请求者就需要等待其他访问请求者释放连接,然后再从连接池中获取连接
-
当数据库访问请求使用完连接后,需要将连接放回到连接池中;
-
当服务停止时,需要先释放数据库连接池中的所有数据库连接,然后再释放数据库连接池对象。