• <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>
            aurain
            技術(shù)文摘
            posts - 137,  comments - 268,  trackbacks - 0

            在有大量節(jié)點(diǎn)訪問(wèn)的數(shù)據(jù)庫(kù)設(shè)計(jì)中,經(jīng)常要使用到連接池來(lái)管理所有的連接.
            一般方法是:建立兩個(gè)連接句柄隊(duì)列,空閑的等待使用的隊(duì)列和正在使用的隊(duì)列.
            當(dāng)要查詢(xún)時(shí)先從空閑隊(duì)列中獲取一個(gè)句柄,插入到正在使用的隊(duì)列,再用這個(gè)句柄做數(shù)據(jù)庫(kù)操作,完畢后一定要從使用隊(duì)列中刪除,再插入到空閑隊(duì)列.
            代碼如下:
            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 //同時(shí)打開(kāi)的連接數(shù)

            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();      //連接數(shù)據(jù)庫(kù)
             MYSQL_RES* SelectRecord(const char *szSql); //選擇記錄,返回結(jié)果集
             bool SelectDB(const char *szDB);  //選擇數(shù)據(jù)庫(kù)
             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);    //查找指定數(shù)據(jù)
             void FreeRecord(MYSQL_RES *myquery);      //釋放結(jié)果集
             unsigned int GetFieldNum(MYSQL_RES *myquery);    //得到字段數(shù)
             MYSQL_ROW GetRecord(MYSQL_RES *myquery);     //得到結(jié)果(一個(gè)記錄)
             my_ulonglong GetRowNum(MYSQL_RES *myquery);    //得到記錄數(shù)
             char* OutErrors(MYSQL* pMySql);      //輸出錯(cuò)誤信息

             char* GetState();      //服務(wù)器狀態(tài)
             char* GetServerInfo();     //服務(wù)器信息
             int GetProtocolInfo();     //協(xié)議信息
             char* GetHostInfo();     //主機(jī)信息
             char* GetClientInfo();     //客戶(hù)機(jī)信息
             char* GetFieldName(MYSQL_RES *myquery, int FieldNum);  //字段名

             bool LockTable(const char *TableName, const char *Priority); //對(duì)特定表加鎖
             bool UnlockTable();      //解鎖
             bool SetCharset();
             //int CreateDB(char *db);    //創(chuàng)建數(shù)據(jù)庫(kù),返回錯(cuò)誤信息
             //int DropDB(char *db);     //刪除數(shù)據(jù)庫(kù),返回錯(cuò)誤信息

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

            public:
             //MYSQL  m_mysql;      //數(shù)據(jù)庫(kù)連接句柄
             MYSQL_ROW m_row;       //記錄集(單行)
             MYSQL_FIELD *m_field;      //字段信息(結(jié)構(gòu)體)

             //創(chuàng)建兩個(gè)隊(duì)列
             CONNECTION_HANDLE_LIST m_lsBusyList;                //正在使用的連接句柄
             CONNECTION_HANDLE_LIST m_lsIdleList;                //未使用的連接句柄

             CRITICAL_SECTION m_csList;

            public:
             char m_host[20];   //主機(jī)
             char m_user[20];   //用戶(hù)名
             char m_password[20];  //密碼
             char m_db[20];    //數(shù)據(jù)庫(kù)名
             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()
            {
             //同時(shí)打開(kāi)CONNECTION_NUM個(gè)連接
             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 閱讀(4555) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): socket編程

            FeedBack:
            # re: 在vc中通過(guò)連接池操作mysql(api方式),附c++訪問(wèn)mysql的封裝類(lèi)
            2008-09-19 13:16 | Zech

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

            常用鏈接

            留言簿(17)

            隨筆分類(lèi)(138)

            隨筆檔案(137)

            網(wǎng)絡(luò)開(kāi)發(fā)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 500439
            • 排名 - 37

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国内精品久久久久久不卡影院| 久久精品久久久久观看99水蜜桃| 久久精品成人影院| 国内精品久久久久影院一蜜桃| 久久无码专区国产精品发布| 香蕉久久一区二区不卡无毒影院 | 国产精品青草久久久久福利99 | 久久99精品九九九久久婷婷| 久久精品国产亚洲综合色| 好久久免费视频高清| 97精品国产97久久久久久免费| 97久久精品人人做人人爽| 久久本道综合久久伊人| 亚洲AⅤ优女AV综合久久久| 欧美久久天天综合香蕉伊| 国内精品综合久久久40p| 久久精品国产亚洲av影院| 99精品久久久久久久婷婷| 午夜精品久久久久久影视riav| 国产午夜福利精品久久2021| 亚洲美日韩Av中文字幕无码久久久妻妇| 99久久无码一区人妻a黑| 久久午夜福利无码1000合集| 日本亚洲色大成网站WWW久久| 色综合久久最新中文字幕| 久久A级毛片免费观看| 无码AV波多野结衣久久| 国产69精品久久久久APP下载| 国产免费久久精品99久久| 亚洲一区二区三区日本久久九| 久久精品国产精品青草app| 99久久久精品| 久久久精品一区二区三区| 久久99国产亚洲高清观看首页| 久久精品亚洲一区二区三区浴池 | 亚洲国产欧洲综合997久久| 久久人人青草97香蕉| 伊人久久精品无码二区麻豆| 久久笫一福利免费导航 | 久久久久人妻一区精品色| 久久久久久国产精品美女|