提高MySQL查询效率的三个技巧(3)

作者:colinchan 来源:陈敏的Blog 时间:2009-02-11 13:19:00 

3、使用连接池管理连接.

在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接.
一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列.
当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队列,再用这个句柄做数据库操作,完毕后一定要从使用队列中删除,再插入到空闲队列.

设计代码如下


//定义句柄队列
typedef std::list<MYSQL *> CONNECTION_HANDLE_LIST;
typedef std::list<MYSQL *>::iterator CONNECTION_HANDLE_LIST_IT;
 
//连接数据库的参数结构
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,查询,效率,技巧,数据库
0
投稿

猜你喜欢

  • 每个分类取最新的几条的SQL实现代码

    2012-08-21 10:57:18
  • asp 关键词高亮显示(不区分大小写)

    2011-04-07 10:55:00
  • MySQL故障:mysqld-nt: Sort aborted错误的原因及解决办法

    2009-11-03 14:32:00
  • 设计师的幸福

    2009-05-21 11:59:00
  • fso文件按照文件名字母排序

    2008-03-09 15:25:00
  • ASP 精华源码收集(五年总结)第1/20页

    2011-04-07 11:15:00
  • MySQL的命令行提示符及其表达的意思

    2008-03-17 13:34:00
  • 数据库安全管理的三个经验分享

    2009-04-01 15:49:00
  • ASP 常见的连接字符串写法(access2007)

    2011-03-25 10:40:00
  • ASP codepage 页面编码使用说明

    2011-03-03 11:24:00
  • MySQL表设计优化与索引 (三)

    2010-10-25 20:05:00
  • Ie6不支持max的解决办法

    2008-12-31 13:11:00
  • MySQL两种识别是否有中文字符的方法

    2011-01-04 20:11:00
  • 通过模版字符串及JSON数据进行目标内容整理的一个小方法

    2010-01-12 16:55:00
  • 快速认识CSS中的overflow属性

    2009-05-29 16:36:00
  • ExtJS 开发总结

    2009-04-28 13:05:00
  • 如何提升JavaScript的运行速度(DOM篇)

    2010-05-17 13:32:00
  • ASP(JScript)构建SQL语句“类”

    2008-04-30 07:12:00
  • 网站浏览器兼容的底线

    2007-12-22 11:26:00
  • 将MySQL 5.0下的数据导入到MySQL 3.23中

    2009-01-04 13:02:00
  • asp之家 网络编程 m.aspxhome.com