1.连接池的介绍:
1.1应用背景:
一般的应用程序都会访问到数据库,在程序访问数据库的时候,每一次数据访问请求都必须经过下面几个步骤:建立数据库连接,打开数据库,对数据库中的数据进行操作,关闭数据库连接。而建立数据库连接和打开数据库是一件很消耗资源并且费时的工作,如果在系统中很频繁的发生这种数据库连接,必然会影响到系统的性能,甚至会导致系统的崩溃。
1.2技术思想:
在系统初始化阶段,建立一定数量的数据库连接对象(Connection),并将其存储在连接池中定义的容器中。当有数据库访问请求时,就从连接池中的这个容器中拿出一个连接;当容器中的连接已经用完,并且还没有达到系统定义的最大连接数时,可以再创建一个新的连接,当当前使用的连接数达到最大连接数时,就要等待其他访问请求将连接放回容器后才能使用。当使用完连接的时候,必须将连接放回容器中,这样不同的数据库访问请求就可以共享这些连接,通过重复使用这些已经建立的数据库连接,可以解决上节中说到的频繁建立连接的缺点,从而提高了系统的性能。
经过上述描述,我们可以归纳出数据库连接池的主要操作:
(1)首先建立一个数据库连接池对象
(2)初始化一定数量的数据库连接,放入连接池对象的容器中
(3)当有数据库访问请求时,直接从连接池的容器中得到一个连接,这里出现三种情况:
(a)当容器中的还有连接时,则返回给数据库访问请求者一个连接
(b)当容器中没有连接时,并且当前建立的连接数没有达到系统定义的最大连接数,则创建一个新的数据库连接。
(c)当容器中的没有连接并且当前建立的连接数达到系统定义的最大连接数,则当前访问数据库请求就要等待其他访问请求释放连接。
(4)当数据库访问完成后,应该将连接放回连接池的容器中。
(5)当服务停止时,需要先释放数据库连接池中的所有数据库连接,然后再释放数据库连接池对象。
2.编程实现:
头文件(connection_pool.h):
/* *File: connection_pool.h *Author: csc */ #ifndef_CONNECTION_POOL_H #define _CONNECTION_POOL_H #include<mysql_connection.h> #include<mysql_driver.h> #include<cppconn/exception.h> #include<cppconn/driver.h> #include<cppconn/connection.h> #include<cppconn/resultset.h> #include<cppconn/prepared_statement.h> #include<cppconn/statement.h> #include<pthread.h> #include<list> usingnamespace std; usingnamespace sql; classConnPool{ private: intcurSize;//当前已建立的数据库连接数量 intmaxSize;//连接池中定义的最大数据库连接数 stringusername; stringpassword; stringurl; list<Connection*>connList;//连接池的容器队列 pthread_mutex_tlock;//线程锁 staticConnPool *connPool; Driver*driver; Connection*CreateConnection();//创建一个连接 voidInitConnection(int iInitialSize);//初始化数据库连接池 voidDestoryConnection(Connection *conn);//销毁数据库连接对象 voidDestoryConnPool();//销毁数据库连接池 ConnPool(stringurl,string user,string password,int maxSize);//构造方法 public: ~ConnPool(); Connection*GetConnection();//获得数据库连接 voidReleaseConnection(Connection *conn);//将数据库连接放回到连接池的容器中 staticConnPool *GetInstance();//获取数据库连接池对象 }; #endif /*_CONNECTION_POOL_H */ |