青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

aurain
技術文摘
posts - 137,  comments - 268,  trackbacks - 0

在有大量節點訪問的數據庫設計中,經常要使用到連接池來管理所有的連接.
一般方法是:建立兩個連接句柄隊列,空閑的等待使用的隊列和正在使用的隊列.
當要查詢時先從空閑隊列中獲取一個句柄,插入到正在使用的隊列,再用這個句柄做數據庫操作,完畢后一定要從使用隊列中刪除,再插入到空閑隊列.
代碼如下:
MySQLMan.h
 // MySQLMan.h: interface for the CMySQLMan class.
//
//////////////////////////////////////////////////////////////////////
#include <mysql.h>
#pragma comment(lib,"libmySQL.lib")

#include <list>

typedef std::list<MYSQL *> CONNECTION_HANDLE_LIST;
typedef std::list<MYSQL *>::iterator ITER_CONNECTION_HANDLE_LIST;

#define CONNECTION_NUM 10 //同時打開的連接數

class CMySQLMan 
{
public:
 CMySQLMan();
 CMySQLMan(const char *host, const char *user, const char *password, const char *db, unsigned int port=3306);
 virtual ~CMySQLMan();
 
public:
 bool ConnectDB();      //連接數據庫
 MYSQL_RES* SelectRecord(const char *szSql); //選擇記錄,返回結果集
 bool SelectDB(const char *szDB);  //選擇數據庫
 bool UpdateRecord(const char *szSql); //更新記錄
 bool InsertRecord(const char *szSql); //插入記錄
 bool DelRecord(const char *szSql);  //刪除記錄

 BOOL IsEnd(MYSQL_RES *myquery);       //是否最后
 void SeekData(MYSQL_RES *myquery, int offset);    //查找指定數據
 void FreeRecord(MYSQL_RES *myquery);      //釋放結果集
 unsigned int GetFieldNum(MYSQL_RES *myquery);    //得到字段數
 MYSQL_ROW GetRecord(MYSQL_RES *myquery);     //得到結果(一個記錄)
 my_ulonglong GetRowNum(MYSQL_RES *myquery);    //得到記錄數
 char* OutErrors(MYSQL* pMySql);      //輸出錯誤信息

 char* GetState();      //服務器狀態
 char* GetServerInfo();     //服務器信息
 int GetProtocolInfo();     //協議信息
 char* GetHostInfo();     //主機信息
 char* GetClientInfo();     //客戶機信息
 char* GetFieldName(MYSQL_RES *myquery, int FieldNum);  //字段名

 bool LockTable(const char *TableName, const char *Priority); //對特定表加鎖
 bool UnlockTable();      //解鎖
 bool SetCharset();
 //int CreateDB(char *db);    //創建數據庫,返回錯誤信息
 //int DropDB(char *db);     //刪除數據庫,返回錯誤信息

 MYSQL* GetIdleMySql();     //提取一個空閑句柄供使用
 void SetIdleMysql(MYSQL* pMySql);  //從使用隊列中釋放一個使用完畢的句柄,插入到空閑隊列

public:
 //MYSQL  m_mysql;      //數據庫連接句柄
 MYSQL_ROW m_row;       //記錄集(單行)
 MYSQL_FIELD *m_field;      //字段信息(結構體)

 //創建兩個隊列
 CONNECTION_HANDLE_LIST m_lsBusyList;                //正在使用的連接句柄
 CONNECTION_HANDLE_LIST m_lsIdleList;                //未使用的連接句柄

 CRITICAL_SECTION m_csList;

public:
 char m_host[20];   //主機
 char m_user[20];   //用戶名
 char m_password[20];  //密碼
 char m_db[20];    //數據庫名
 unsigned int m_port;  //端口
};

MySQLMan.cpp
// MySQLMan.cpp: implementation of the MySQLMan class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "MySQLMan.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMySQLMan::CMySQLMan()
{
 
}

CMySQLMan::CMySQLMan(const char *host, const char *user, const char *password, const char *db, unsigned int port/* =3306 */)
{
 strcpy(m_host, host);
 strcpy(m_user, user);
 strcpy(m_password, password);
 strcpy(m_db, db);
 m_port = port;

 InitializeCriticalSection(&m_csList);
}

CMySQLMan::~CMySQLMan()
{
 for (ITER_CONNECTION_HANDLE_LIST iter=m_lsBusyList.begin(); iter != m_lsBusyList.end(); iter++)
 {
  mysql_close((*iter));
 }

 for (ITER_CONNECTION_HANDLE_LIST iter=m_lsIdleList.begin(); iter != m_lsIdleList.end(); iter++)
 {
  mysql_close((*iter));
 }

 DeleteCriticalSection(&m_csList);
}

bool CMySQLMan::ConnectDB()
{
 //同時打開CONNECTION_NUM個連接
 try
 {
  for (int i=0; i<CONNECTION_NUM; ++i)
  {
   MYSQL *pMySql = mysql_init((MYSQL*)NULL);
   if (pMySql != NULL)
   {
    if (!mysql_real_connect(pMySql,m_host,m_user,m_password,m_db,m_port,NULL,0))
    {
     OutErrors(pMySql);
     return false;
    }
    m_lsIdleList.push_back(pMySql);
   }
  }
 }
 catch (...)
 {
  return false;
 }
 return true;
}

MYSQL* CMySQLMan::GetIdleMySql()
{
 MYSQL* pMySql = NULL;
 EnterCriticalSection(&m_csList);
 if (m_lsIdleList.size() > 0)
 {
  pMySql = m_lsIdleList.front();
  m_lsIdleList.pop_front();
  m_lsBusyList.push_back(pMySql);
 }
 else
 {
  pMySql = NULL;
 }
 LeaveCriticalSection(&m_csList);

 return pMySql;
}

void CMySQLMan::SetIdleMysql(MYSQL* pMySql)
{
 EnterCriticalSection(&m_csList);
 m_lsBusyList.remove(pMySql);
 m_lsIdleList.push_back(pMySql);
 LeaveCriticalSection(&m_csList);
}

MYSQL_RES* CMySQLMan::SelectRecord(const char *szSql)
{
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return NULL;
 }
 if(mysql_query(pMySql,szSql))
  return NULL;
 MYSQL_RES *myquery = NULL;
 myquery = mysql_store_result(pMySql);
 SetIdleMysql(pMySql);

 return myquery;
}

bool CMySQLMan::InsertRecord(const char *szSql)
{
 bool bRet = false;
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return false;
 }
 if(mysql_query(pMySql,szSql))
 {
  bRet = true;
 }
 SetIdleMysql(pMySql);

 return bRet;
}

bool CMySQLMan::UpdateRecord(const char *szSql)
{
 bool bRet = false;
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return false;
 }
 if(mysql_query(pMySql,szSql))
 {
  bRet = true;
 }
 SetIdleMysql(pMySql);

 return bRet;
}

bool CMySQLMan::DelRecord(const char *szSql)
{
 bool bRet = false;
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return false;
 }
 if(mysql_query(pMySql,szSql))
 {
  bRet = true;
 }
 SetIdleMysql(pMySql);

 return bRet;
}

bool CMySQLMan::SelectDB(const char *szDB)
{
 bool bRet = false;
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return false;
 }
 if (mysql_select_db(pMySql,szDB))
  bRet = false; 
 else
  bRet = true;
 SetIdleMysql(pMySql);

 return bRet;
}

my_ulonglong CMySQLMan::GetRowNum(MYSQL_RES *myquery)
{
 return mysql_num_rows(myquery);
}

MYSQL_ROW CMySQLMan::GetRecord(MYSQL_RES *myquery)
{
 m_row = mysql_fetch_row(myquery);

 return m_row;
}

unsigned int CMySQLMan::GetFieldNum(MYSQL_RES *myquery)
{
 return mysql_num_fields(myquery);
}

void CMySQLMan::FreeRecord(MYSQL_RES *myquery)
{
 mysql_free_result(myquery);
}

//int CMySQLMan::CreateDB(char *db)
//{
// return mysql_create_db(&m_mysql,db);
//}

void CMySQLMan::SeekData(MYSQL_RES *myquery, int offset)
{
 mysql_data_seek(myquery,offset);
}


char * CMySQLMan::OutErrors(MYSQL *pMySql)
{
 return const_cast<char *>(mysql_error(pMySql));
}

BOOL CMySQLMan::IsEnd(MYSQL_RES *myquery)
{
 return mysql_eof(myquery);
}

char* CMySQLMan::GetFieldName(MYSQL_RES *myquery, int FieldNum)
{
 m_field = mysql_fetch_field_direct(myquery, FieldNum);

 return m_field->name;
}

char * CMySQLMan::GetClientInfo()
{
 return const_cast<char *>(mysql_get_client_info());
}

char* CMySQLMan::GetHostInfo()
{
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return NULL;
 }
 return const_cast<char *>(mysql_get_host_info(pMySql));
}

int CMySQLMan::GetProtocolInfo()
{
 int iRet = 0;
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return NULL;
 }
 iRet = mysql_get_proto_info(pMySql);
 SetIdleMysql(pMySql);

 return iRet;
}

char* CMySQLMan::GetServerInfo()
{
 static char szRet[1024];
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return NULL;
 }
 _tcscpy(szRet, const_cast<char *>(mysql_get_server_info(pMySql)));
 SetIdleMysql(pMySql);

 return szRet;
}

char* CMySQLMan::GetState()
{
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return NULL;
 }
 static char szRet[1024];
 _tcscpy(szRet,const_cast<char *>(mysql_stat(pMySql)));
 SetIdleMysql(pMySql);

 return szRet;
}

bool CMySQLMan::SetCharset()
{
 bool bRet = false;
 char szSql[50];
 strcpy(szSql, "set names gb2312");
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return false;
 }
 if (mysql_query(pMySql, szSql))
  bRet = true;
 SetIdleMysql(pMySql);

 return bRet;
}

//LOCK TABLES tbl1 READ, tbl2 WRITE
bool CMySQLMan::LockTable(const char *TableName, const char *Priority)
{
 bool bRet = false;
 char szSql[50];
 sprintf(szSql, "LOCK TABLES %s %s", TableName, Priority);
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return false;
 }
 if (mysql_query(pMySql, szSql))
  bRet = true;
 SetIdleMysql(pMySql);

 return bRet;
}

bool CMySQLMan::UnlockTable()
{
 bool bRet = false;
 MYSQL *pMySql = GetIdleMySql();
 if (pMySql == NULL)
 {
  return false;
 }
 if(mysql_query(pMySql,"UNLOCK TABLES"))
  bRet = true;
 SetIdleMysql(pMySql);

 return bRet;

}

 

posted on 2008-02-21 15:10 閱讀(4571) 評論(1)  編輯 收藏 引用 所屬分類: socket編程

FeedBack:
# re: 在vc中通過連接池操作mysql(api方式),附c++訪問mysql的封裝類
2008-09-19 13:16 | Zech
mysql++  回復  更多評論
  

<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(17)

隨筆分類(138)

隨筆檔案(137)

網絡開發

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 502449
  • 排名 - 37

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99精品国产在热久久婷婷| 老牛嫩草一区二区三区日本| 久久久精品国产免大香伊| 毛片一区二区| 999亚洲国产精| 欧美在线免费播放| 欧美区亚洲区| 国产亚洲永久域名| 日韩视频第一页| 亚洲高清毛片| 欧美成人情趣视频| 99国产精品| 久久精品人人爽| 欧美视频中文字幕在线| 国产综合欧美在线看| 99pao成人国产永久免费视频| 午夜精品久久久久久久久 | 一区二区亚洲欧洲国产日韩| 欧美三级视频在线| 欧美va亚洲va日韩∨a综合色| 欧美日韩亚洲网| 国内成人精品2018免费看| 久久精品国产一区二区电影 | 久久人人精品| 亚洲国产中文字幕在线观看| 亚洲欧美日韩另类| 欧美中文字幕在线视频| 欧美日韩福利在线观看| 国产字幕视频一区二区| 这里只有精品电影| 欧美成人tv| 亚洲主播在线播放| 欧美激情一区二区三区蜜桃视频| 国产欧美日韩一区二区三区| 亚洲乱码国产乱码精品精98午夜| 久久久久久综合| 在线视频亚洲| 欧美激情国产日韩精品一区18| 国产在线欧美日韩| 亚洲一区二区影院| 亚洲福利视频网| 欧美一级片一区| 国产精品播放| 99热这里只有成人精品国产| 免费日韩视频| 久久精品理论片| 国产日韩欧美在线| 午夜一区在线| 一区二区精品在线| 欧美区一区二区三区| 亚洲高清不卡一区| 老司机精品导航| 久久成人亚洲| 国语自产精品视频在线看一大j8 | 亚洲少妇在线| 亚洲精品欧美激情| 欧美精品 国产精品| 亚洲国产天堂久久综合网| 免费成人激情视频| 久久久国产午夜精品| 国产在线视频不卡二| 久久久国产精彩视频美女艺术照福利 | 久久久久青草大香线综合精品| 亚洲一区二区黄色| 国产精品欧美日韩久久| 亚洲中字黄色| 一区二区久久久久| 国产精品扒开腿爽爽爽视频| 中文精品视频一区二区在线观看| 亚洲国产精品悠悠久久琪琪| 欧美激情精品久久久久久变态| 亚洲国产精品一区在线观看不卡 | 亚洲精品在线视频观看| 欧美二区在线观看| 欧美成人小视频| 亚洲美女性视频| 一本久道久久久| 国产精品久久久久久久久免费樱桃| 亚洲欧美日韩国产综合在线| 亚洲永久在线| 国内精品久久久久久久影视蜜臀 | 亚洲精品一二| 一二美女精品欧洲| 国产精品美女主播| 久久精品一区二区国产| 久久精品国产一区二区三区| 亚洲高清自拍| 亚洲毛片网站| 国产精品视频yy9099| 久久久久99| 久久在线91| 艳女tv在线观看国产一区| 在线综合亚洲| 激情小说另类小说亚洲欧美| 亚洲福利在线视频| 欧美日韩在线免费观看| 欧美中文在线观看| 老司机成人在线视频| 一本色道88久久加勒比精品| 亚洲一区欧美| 亚洲大胆人体视频| 日韩亚洲国产欧美| 国产日韩欧美电影在线观看| 欧美成人精品高清在线播放| 欧美精品日韩一区| 久久本道综合色狠狠五月| 久久最新视频| 亚洲亚洲精品三区日韩精品在线视频| 亚洲欧美自拍偷拍| 91久久国产自产拍夜夜嗨| 日韩一级免费| 精久久久久久| avtt综合网| 1000部精品久久久久久久久| 99精品视频免费观看视频| 韩日欧美一区| 日韩一区二区精品视频| 激情懂色av一区av二区av| 亚洲精品综合久久中文字幕| 国产一区二区三区精品欧美日韩一区二区三区 | 国产麻豆午夜三级精品| 欧美激情在线免费观看| 国产美女搞久久| 亚洲黄色av一区| 国产欧美精品| 亚洲精品美女在线观看播放| 国产一区二区三区日韩| 亚洲美女毛片| 在线观看的日韩av| 亚洲私人影院在线观看| 亚洲片区在线| 欧美一级久久久久久久大片| 一区二区不卡在线视频 午夜欧美不卡在| 欧美一区二区三区精品电影| 999亚洲国产精| 久久影院午夜论| 欧美一区二区视频观看视频| 欧美剧在线免费观看网站| 久热爱精品视频线路一| 国产精品久久夜| 亚洲人成网站999久久久综合| 狠狠色丁香婷婷综合| 中日韩男男gay无套| 亚洲美女啪啪| 久久视频精品在线| 久久精品72免费观看| 欧美日韩成人精品| 欧美激情亚洲视频| 国产自产在线视频一区| 亚洲一区二区三区在线看 | 亚洲视频中文| 夜夜爽99久久国产综合精品女不卡 | 亚洲欧美国产高清va在线播| 欧美激情第4页| 欧美成人午夜激情在线| 国内精品久久久久久久影视蜜臀| 亚洲一区视频| 亚洲午夜免费福利视频| 欧美精品91| 亚洲国产精品久久久久婷婷884| 伊人蜜桃色噜噜激情综合| 欧美一区二区三区另类| 午夜日韩福利| 国产精品你懂的在线欣赏| 99热精品在线| 亚洲午夜未删减在线观看| 欧美日产国产成人免费图片| 91久久精品一区二区别| 亚洲久久一区| 欧美精品一区二区三| 亚洲国产欧美在线人成| 亚洲精品日韩精品| 欧美成人免费小视频| 亚洲国产成人av好男人在线观看| 亚洲国产精品久久久久| 另类激情亚洲| 亚洲高清不卡在线| 亚洲三级性片| 欧美精品一区二区三区在线看午夜 | 国产一区二区三区免费不卡| 欧美一级在线视频| 久久精品国产精品| 国产一区二区三区日韩| 久久精品免费播放| 欧美3dxxxxhd| 亚洲精品视频在线播放| 欧美日韩国产精品一卡| 99精品福利视频| 欧美亚洲免费电影| 国产欧美日韩中文字幕在线| 欧美一区二粉嫩精品国产一线天| 久久九九99| 亚洲国产精品va在线看黑人动漫 | 亚洲精品在线观| 亚洲综合视频1区| 国产日韩亚洲欧美| 久久婷婷av| 亚洲欧洲在线视频| 亚洲欧美视频一区| 国产一区二区三区四区三区四|