• <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)訪問的數(shù)據(jù)庫設(shè)計(jì)中,經(jīng)常要使用到連接池來管理所有的連接.
            一般方法是:建立兩個(gè)連接句柄隊(duì)列,空閑的等待使用的隊(duì)列和正在使用的隊(duì)列.
            當(dāng)要查詢時(shí)先從空閑隊(duì)列中獲取一個(gè)句柄,插入到正在使用的隊(duì)列,再用這個(gè)句柄做數(shù)據(jù)庫操作,完畢后一定要從使用隊(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í)打開的連接數(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ù)庫
             MYSQL_RES* SelectRecord(const char *szSql); //選擇記錄,返回結(jié)果集
             bool SelectDB(const char *szDB);  //選擇數(shù)據(jù)庫
             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();     //客戶機(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ù)庫,返回錯(cuò)誤信息
             //int DropDB(char *db);     //刪除數(shù)據(jù)庫,返回錯(cuò)誤信息

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

            public:
             //MYSQL  m_mysql;      //數(shù)據(jù)庫連接句柄
             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];   //用戶名
             char m_password[20];  //密碼
             char m_db[20];    //數(shù)據(jù)庫名
             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í)打開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)  編輯 收藏 引用 所屬分類: socket編程

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

            <2008年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(17)

            隨筆分類(138)

            隨筆檔案(137)

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

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 500428
            • 排名 - 37

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久久久久99精品免费观看| 狠狠精品久久久无码中文字幕 | 久久99精品国产麻豆宅宅| 亚洲AV日韩AV天堂久久| 久久国产精品成人免费| 久久精品国产精品亚洲| 久久香蕉超碰97国产精品 | 久久综合九色综合网站| 国产亚洲色婷婷久久99精品| 久久久久一级精品亚洲国产成人综合AV区 | 久久久久亚洲AV无码专区首JN | 亚洲欧美日韩中文久久| 一本久久a久久精品综合夜夜| 一级做a爰片久久毛片看看| 国产精品久久久久国产A级| 久久久久无码中| 久久99国产精一区二区三区| 久久久久久国产精品无码下载| 精品久久久久久久无码| 久久精品国产精品亚洲精品| 久久99精品久久久久久9蜜桃| av无码久久久久不卡免费网站| 午夜福利91久久福利| 久久成人影院精品777| 色狠狠久久AV五月综合| 一级a性色生活片久久无| 久久久久噜噜噜亚洲熟女综合| 久久国产精品久久| 久久噜噜电影你懂的| 欧美va久久久噜噜噜久久| 色妞色综合久久夜夜 | 久久精品人人做人人爽电影| 国内精品九九久久久精品| 亚洲综合熟女久久久30p| 久久SE精品一区二区| 亚洲伊人久久成综合人影院| 色婷婷噜噜久久国产精品12p| 久久婷婷五月综合色99啪ak | 99久久人妻无码精品系列蜜桃| 国内精品久久久人妻中文字幕| 亚洲精品乱码久久久久66|