提高MYSQL查询效率的三个有效的尝试(3)

来源:陈敏的Blog 时间:2009-02-27 16:08: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
投稿

猜你喜欢

  • Django的分页器实例(paginator)

    2023-06-23 03:22:35
  • 用Python实现KNN分类算法

    2021-12-26 14:15:24
  • vue2.0 循环遍历加载不同图片的方法

    2024-05-08 10:24:50
  • Oracle中在pl/sql developer修改表的2种方法

    2024-01-20 13:06:35
  • go项目中环境变量的配置

    2024-02-12 12:17:55
  • vue+element项目中过滤输入框特殊字符小结

    2024-04-28 10:53:44
  • JS脚本实现网页自动秒杀点击

    2024-04-16 09:36:09
  • Python利用matplotlib画出漂亮的分析图表

    2023-03-04 01:10:09
  • Python兔子毒药问题实例分析

    2023-11-14 11:23:56
  • python实现linux下使用xcopy的方法

    2022-08-16 07:52:09
  • python中列表元素连接方法join用法实例

    2023-01-20 17:49:31
  • Python version 2.7 required, which was not found in the registry

    2021-06-02 14:57:13
  • 史上最全Python文件类型读写库大盘点

    2021-01-28 22:08:26
  • Linux下设置每天自动备份数据库的方法

    2024-01-24 02:45:31
  • 详解Python基础random模块随机数的生成

    2021-07-29 08:12:01
  • Python map和reduce函数用法示例

    2022-06-21 09:02:25
  • 基于Python脚本实现邮件报警功能

    2023-02-04 17:16:41
  • Python列表创建与销毁及缓存池机制

    2023-11-29 14:21:21
  • Java正则表达式API边界匹配

    2023-07-03 19:36:18
  • JavaScript实现省市县三级级联特效

    2024-04-18 10:55:56
  • asp之家 网络编程 m.aspxhome.com