使用连接池管理连接.

绩溪网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联成立与2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接.
一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列.
当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队列,再用这个句柄做数据库操作,完毕后一定要从使用队列中删除,再插入到空闲队列.
设计代码如下:
以下为引用的内容:
//定义句柄队列
 typedef std::list
 typedef std::list
//连接数据库的参数结构
 class CDBParameter
{
 public:
 char *host; ///<主机名
 char *user; ///<用户名
 char *password; ///<密码
 char *database; ///<数据库名
 unsigned int port; ///<端口,一般为0
 const char *unix_socket; ///<套接字,一般为NULL
 unsigned int client_flag; ///<一般为0
 };
//创建两个队列
 CONNECTION_HANDLE_LIST m_lsBusyList; ///<正在使用的连接句柄
 CONNECTION_HANDLE_LIST m_lsIdleList; ///<未使用的连接句柄
//所有的连接句柄先连上数据库,加入到空闲队列中,等待使用.
 bool CDBManager::Connect(char * host /* = "localhost" */, char * user /* = "chenmin" */, \
 char * password /* = "chenmin" */, char * database /* = "HostCache" */)
 {
 CDBParameter * lpDBParam = new CDBParameter();
 lpDBParam->host = host;
 lpDBParam->user = user;
 lpDBParam->password = password;
 lpDBParam->database = database;
 lpDBParam->port = 0;
 lpDBParam->unix_socket = NULL;
 lpDBParam->client_flag = 0;
 try
 {
 //连接
 for(int index = 0; index < CONNECTION_NUM; index++)
 {
 MYSQL * pConnectHandle = mysql_init((MYSQL*) 0); //初始化连接句柄
 if(!mysql_real_connect(pConnectHandle, lpDBParam->host, lpDBParam->user, lpDBParam->password,\
 lpDBParam->database,lpDBParam->port,lpDBParam->unix_socket,lpDBParam->client_fla))
 return false;
 //加入到空闲队列中
 m_lsIdleList.push_back(pConnectHandle);
 }
 }
 catch(...)
 {
 return false;
 }
 return true;
 }
//提取一个空闲句柄供使用
 MYSQL * CDBManager::GetIdleConnectHandle()
 {
 MYSQL * pConnectHandle = NULL;
 m_ListMutex.acquire();
 if(m_lsIdleList.size())
 {
 pConnectHandle = m_lsIdleList.front(); 
 m_lsIdleList.pop_front();
 m_lsBusyList.push_back(pConnectHandle);
 }
 else //特殊情况,闲队列中为空,返回为空
 {
 pConnectHandle = 0;
 }
 m_ListMutex.release();
return pConnectHandle;
 }
//从使用队列中释放一个使用完毕的句柄,插入到空闲队列
 void CDBManager::SetIdleConnectHandle(MYSQL * connecthandle)
 {
 m_ListMutex.acquire();
 m_lsBusyList.remove(connecthandle);
 m_lsIdleList.push_back(connecthandle);
 m_ListMutex.release();
 }
 //使用示例,首先获取空闲句柄,利用这个句柄做真正的操作,然后再插回到空闲队列
 bool CDBManager::DeleteHostCacheBySessionID(char * sessionid)
 {
 MYSQL * pConnectHandle = GetIdleConnectHandle();
 if(!pConnectHandle)
 return 0;
 bool bRet = DeleteHostCacheBySessionID(pConnectHandle, sessionid);
 SetIdleConnectHandle(pConnectHandle);
 return bRet;
 }
 //传入空闲的句柄,做真正的删除操作
 bool CDBManager::DeleteHostCacheBySessionID(MYSQL * connecthandle, char * sessionid)
 {
 char deleteSQL[SQL_LENGTH];
 memset(deleteSQL, 0, sizeof(deleteSQL));
 sprintf(deleteSQL,"delete from HostCache where SessionID = '%s'", sessionid);
 if(mysql_query(connecthandle,deleteSQL) != 0) //删除
 return false;
 return true;
 }
【编辑推荐】
                本文名称:提高MySQL数据库查询效率的技巧(三)
                
                标题网址:http://www.csdahua.cn/qtweb/news40/140590.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网