提高MySQL数据库查询效率的三个实用技巧(3)
作者:17819 发布时间:2008-12-03 16:40:00
使用连接池管理连接
在有大量节点访问的数据库设计中,经常要使用到连接池来管理所有的连接.
一般方法是:建立两个连接句柄队列,空闲的等待使用的队列和正在使用的队列.
当要查询时先从空闲队列中获取一个句柄,插入到正在使用的队列,再用这个句柄做数据库操作,完毕后一定要从使用队列中删除,再插入到空闲队列.
设计代码如下:
//定义句柄队列
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;
}
猜你喜欢
- 代码如下:<%@LANGUAGE="VBSCRIPT"%> <% option&n
- 在进行WEB标准网页设计时,必不可少的是写入大量的CSS语法,一般情况下我们可以通过Dreamweaver软件的“CSS样式”面板自动生成相
- 简介CSS Sprites并没有一个确定的中文翻译,通常被意译为“CSS图像拼合”或“CSS贴图定位”。CSS Sprites并不是一门新技
- 今天工作中遇到,拿出来说说。网上CSS下拉菜单不少,不过都存在这样那样的问题,主要问题是,如果你菜单下面有一个FLASH的话,很多都会被FL
- --语 句 功 能 --数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --
- 前不久听到这样一个面试的故事:面试官:你准备在我们公司做些什么事情?(大致这个意思)面试人:我准备在公司做网站重构,把原来是table的页面
- a {}{ background:url(images/normal.gif); } a:ho
- alert table 表名 add column 列名 alter table 表名 drop column 列名 eg: alter t
- 数组使用简介原文地址:30 Days of Mootools 1.2 Tutorials - Day 3 - Intro to Using
- Silverlight也算一个比较开放的技术。Button控件其实也是一些标准的Grid、Canvas、Rectangle、TextBloc
- 网站改版,如何改?如果只是设计、功能和栏目等的稍微变动,这些很简单,从技术 上说并没有多少难度。只是对于网站本身的发展来说,没有多大的作用,
- 如何使用表单发送电子邮件?邮件也可以用表单格式发送吗?我见一个朋友这样做的。当然可以,用OCXMail就行:formToEmail.htm&
- 1。onabort(ns3,ns4,ie4):当用户终止正在打开的网页时产生该事件。2。onblur(ns3,ns4,ie3,ie4):某元
- IE历来被web标准的拥护者所诟病,而当FireFox横空出世以后,更多的网页制作者开始关注web标准设计。看着FireFox的市场占有率不
- 印刷和网络是不一样的。传统的布局排版并不适于网络,因为传统的印刷布局,几乎只想要什么样的平面效果都能很好的达到,但在网络上设计就很困难,尽管
- 编者注:当讲到了性能优化和案例方面的东西,就要想到如何从开发人员的角度进行了理解,认识SQL是如何执行,以及如何学习高级的SQL,这篇文章对
- 此前piscdong已经做过一次评测了,这次的Beta正式推出,我也来参与一下.当回小白鼠吧.新的界面设计非常让人兴奋750){this.r
- 上一篇的DOCTYPE声明好以后,接下来的代码是:<html xmlns="xhtml" ta
- 最近真的喜欢上了用xheditor这个在线编辑器,但是美中不足的是我发现它暂时还不能取代FCKeditor,因为没有在线上传功能啊!当然,F
- chr(13) 是一个回车Chr(10) 是一个换行符chr