• <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>

            興海北路

            ---男兒仗劍自橫行
            <2013年11月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            統(tǒng)計

            • 隨筆 - 85
            • 文章 - 0
            • 評論 - 17
            • 引用 - 0

            常用鏈接

            留言簿(6)

            隨筆分類

            隨筆檔案

            收藏夾

            全是知識啊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            基于C API的MySQL數(shù)據(jù)庫多線程訪問方法
            摘要:目前,數(shù)據(jù)庫在各行各業(yè)中廣泛應(yīng)用。在眾多商業(yè)數(shù)據(jù)庫軟件中,SQL SERVER 和ORACLE被較多的使用,因此這兩個數(shù)據(jù)庫軟件的價格也較昂貴。本文主要介紹MySQL數(shù)據(jù)庫在單線程或多線程程序環(huán)境下使用C API訪問MySQL數(shù)據(jù)庫方法,并給出了相應(yīng)代碼和分析。該數(shù)據(jù)庫屬于開源數(shù)據(jù)庫,具有較高的成熟度,并且對于社區(qū)版本可以免費(fèi)使用,因此對于需要使用 C API訪問數(shù)據(jù)庫的項目開發(fā),可降低開發(fā)成本。
              關(guān)鍵詞:MySQL;C API;多線程
              中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2007)16-30904-02
              Based on C API MySQL Database Multi-threaded Access Methods
              YU Cheng-gong
              (Zhejiang Pharmaceutical College,Ningbo 315100,China)
              Abstract:Currently,the database in all walks of life were widely used.In many commercial database software,SQL Server and Oracle are used more and therefore their prices are more expensive. This paper describes the MySQL database in single-threaded or multi-threaded programming environment using C API access to the MySQL database, and gives the corresponding code and analysis. The database is open source database, with a higher maturity level, and the community version can be used for free. It satisfies the need to use the C API access to the database of project development, and reduces development costs.
              Key words:MySQL;C API;multi-threaded

              1 引言

              隨著社會信息化的深入,數(shù)據(jù)庫在社會各個領(lǐng)域被廣泛應(yīng)用。在這些數(shù)據(jù)庫應(yīng)用項目開發(fā)過程中,需要做兩方面的決策:1. 使用何種數(shù)據(jù)庫軟件;2. 采用何種方式訪問數(shù)據(jù)庫。數(shù)據(jù)庫軟件的選擇面比較寬,在目前眾多商業(yè)數(shù)據(jù)庫軟件中,SQL SERVER 和ORACLE被較多的使用,當(dāng)然這兩個數(shù)據(jù)庫軟件的價格也較昂貴,本文選擇可免費(fèi)使用的MySQL數(shù)據(jù)庫社區(qū)版本,MySQL庫屬于開源數(shù)據(jù)庫,具有較 高的成熟度和可靠性。數(shù)據(jù)庫的訪問方式有很多,可以使用ODBC、DAO、ADO等方法,這些方法簡單直接但是效率不高,不適合大型復(fù)雜的系統(tǒng)使用,例如 網(wǎng)絡(luò)游戲的數(shù)據(jù)庫系統(tǒng)開發(fā)需要考慮同時大量的數(shù)據(jù)庫訪問,因此訪問的效率非常重要。基于C程序語言的高效率,使用C API訪問數(shù)據(jù)庫可以提高數(shù)據(jù)庫的訪問效率。基于以上兩點,本文將介紹基于C API的MySQL數(shù)據(jù)庫訪問方法,給出在單線程和多線程程序環(huán)境下的具體代碼和分析。

              2 建表

              為了方便說明數(shù)據(jù)庫的訪問,先建立一個數(shù)據(jù)庫表TestTable,可以使用SQL語句創(chuàng)建該表,也可以使用MySQL提供的圖形界面來創(chuàng)建。數(shù)據(jù)庫表中字段如下:
              該數(shù)據(jù)庫表使用最常見的用戶名和密碼作為字段,本文將通過該表來實現(xiàn)不同程序環(huán)境下基于C API的數(shù)據(jù)庫的訪問方法。

              3 單線程程序的數(shù)據(jù)庫訪問

              單線程應(yīng)用程序訪問MySQL數(shù)據(jù)庫相對簡單,其過程包含以下幾步:
              (1)初始化MySQL庫
              (2)初始化數(shù)據(jù)庫連接句柄
              (3)連接數(shù)據(jù)庫
              (4)通過SQL語句操作數(shù)據(jù)庫并處理相應(yīng)數(shù)據(jù)
              (5)關(guān)閉數(shù)據(jù)庫連接
              (6)結(jié)束MySQL庫
              通過這五個步驟即可實現(xiàn)數(shù)據(jù)庫的訪問,具體代碼和分析如下:
              //在main主函數(shù)中添加代碼
              //1.定義訪問數(shù)據(jù)庫所需變量
              MYSQL * myData;
              MYSQL_RES * res;
              MYSQL_ROW row;
              //2. 初始化MySQL庫和數(shù)據(jù)庫連接句柄
              myData = mysql_init((MYSQL*) 0);
              //3. 連接數(shù)據(jù)庫,MYSQL_IP和MYSQL_PORT表示數(shù)據(jù)庫的IP和端口
              // MYSQL_ACCOUNT, MYSQL_PASSWORD表示數(shù)據(jù)庫連接的帳號和密碼
              //MYSQL_DBNAME表示所要訪問的數(shù)據(jù)庫名
              mysql_real_connect( myData, MYSQL_IP, MYSQL_ACCOUNT, MYSQL_PASSWORD, MYSQL_DBNAME, MYSQL_PORT,NULL, 0 )
              //4. 通過SQL語句操作數(shù)據(jù)庫并處理相應(yīng)數(shù)據(jù)
              //4.1新建用戶名為abcdef,密碼為123456的記錄
              mysql_query(myData, "insert into TestTable value(‘abcdef’,’ 123456’)");
              //4.2顯示所有記錄
              //查詢所有記錄
              mysql_query(myData, "select * from TestTable");
              //將查詢結(jié)果保存到res中
              res = mysql_store_result( myData ) ;
              //逐條顯示記錄
              Int j = 0;
              while ( row = mysql_fetch_row( res ) ) {//獲取一條記錄
              j = mysql_num_fields( res ) ;//獲取每條記錄的字段數(shù)
            for ( k = 0 ; k < j ; k++ )
              printf( “%s”, row[k] ) ;
              printf( “\n”) ;
              }
              //釋放res
              mysql_free_result( res ) ;
              //5. 關(guān)閉數(shù)據(jù)庫連接
              mysql_close( myData );
              //6. 結(jié)束MySQL庫
              mysql_library_end();
              關(guān)于代碼的幾點說明:
              (1)定義變量中的三個數(shù)據(jù)結(jié)構(gòu)為訪問MySQL所需,MYSQL結(jié)構(gòu)表示一個數(shù)據(jù)庫連接的句柄,其中包含了數(shù)據(jù)庫連接所需的參數(shù),MYSQL_RES結(jié)構(gòu)表示數(shù)據(jù)庫訪問中一個查詢的返回結(jié)果,MYSQL_ROW結(jié)構(gòu)表示返回結(jié)構(gòu)中的一條記錄;
              (2)獲取查詢結(jié)果res并處理完畢,必須釋放res,否則會造成內(nèi)存泄露
              (3)在單線程時,步驟初始化MySQL庫和數(shù)據(jù)庫連接句柄可合并, 由mysql_init()來處理。該函數(shù)會自動調(diào)用函數(shù)mysql_library_init()來初始化MySQL庫,同時初始化連接句柄。

              4 多線程環(huán)境下的數(shù)據(jù)庫訪問

              多線程環(huán)境下的數(shù)據(jù)庫訪問需要保證線程安全。Windows版本的MySQL C API函數(shù)都是線程安全的,除了mysql_library_init(),而我們剛才的代碼中使用的mysql_init()函數(shù)會自動調(diào)用函數(shù) mysql_library_init()來初始化MySQL庫,因此在多線程環(huán)境下,需要不同的初始化代碼和清理代碼。具體過程如下:
              (1)在主函數(shù)中調(diào)用mysql_library_init()來初始化MySQL庫;
              (2)啟動各數(shù)據(jù)庫訪問線程
              (3)主函數(shù)等待各個線程的結(jié)束
              (4)調(diào)用mysql_library_end ()清理MySQL庫。
              其中數(shù)據(jù)庫訪問線程的代碼和單線程數(shù)據(jù)庫訪問代碼類似,但是需要如下變化:
              (1)單線程中的第2步初始化MySQL庫和數(shù)據(jù)庫連接句柄,不能再使用mysql_init(),代碼應(yīng)作如下修改:
              //初始化線程
              my_init();
              mysql_thread_init();
              //初始化myData
              myData = malloc(sizeof(MYSQL));
              memset(&myData, 0, sizeof(MYSQL))
              (2)上述初始化myData,只是將myData所有成員設(shè)為0,如果有需要可以根據(jù)具體情況設(shè)置該結(jié)構(gòu)成員的值,例myData->reconnect= 1,其作用是設(shè)置數(shù)據(jù)庫連接屬性為重連接,即當(dāng)數(shù)據(jù)庫連接斷開時,自動重新連接;
              (3)單線程中的第6步不在需要,改為結(jié)束線程的清理工作,即調(diào)用mysql_thread_end()函數(shù)。

              5 總結(jié)

              綜上所述,使用C API訪問MySQL數(shù)據(jù)庫在不同線程環(huán)境下的區(qū)別主要在于初始化和訪問結(jié)束后清理代碼,也就是說除了初始化和清理代碼,MySQL提供給我們的C API函數(shù)都是線程安全的。最后需要有一點說明,使用C API訪問數(shù)據(jù)庫可以提高數(shù)據(jù)庫的訪問效率,但并不是所有的數(shù)據(jù)庫項目都適合這種方式,該方式適合需要大量實時并發(fā)處理的數(shù)據(jù)庫項目,例如網(wǎng)絡(luò)游戲的數(shù)據(jù) 庫項目,對于有此需求的數(shù)據(jù)庫項目可參考本文。

              參考文獻(xiàn):
              [1]MySQL AB,MySQL 5.0 Reference Manual.

              注:“本文中所涉及到的圖表、公式注解等形式請以PDF格式閱讀原文。”

            posted on 2008-04-22 16:35 隨意門 閱讀(5050) 評論(1)  編輯 收藏 引用

            評論

            # re: 基于C API的MySQL數(shù)據(jù)庫多線程訪問方法 2013-11-26 14:00 ysw

            memset(&myData, 0, sizeof(MYSQL))
            應(yīng)該為: memset(myData, 0, sizeof(MYSQL))
              回復(fù)  更多評論    

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            狠狠色丁香久久婷婷综合图片| 97久久精品午夜一区二区| 国产婷婷成人久久Av免费高清| 日日狠狠久久偷偷色综合96蜜桃| 久久久久国色AV免费看图片| 久久久久99这里有精品10| 精品久久人妻av中文字幕| 欧美大战日韩91综合一区婷婷久久青草 | 亚洲国产成人久久综合一| 久久亚洲中文字幕精品一区四| 久久久久久免费视频| 国产成人精品久久亚洲| 亚洲精品乱码久久久久久蜜桃不卡 | 精品人妻久久久久久888| 国内精品免费久久影院| 久久婷婷成人综合色综合| 久久精品国产福利国产琪琪| 久久精品亚洲日本波多野结衣 | 久久狠狠爱亚洲综合影院| 久久精品国产一区二区 | 99久久99这里只有免费费精品| 精品久久久久中文字幕一区| 久久夜色精品国产噜噜麻豆| 欧美午夜A∨大片久久 | 久久亚洲欧美日本精品| 久久精品国产亚洲AV高清热| 久久久亚洲欧洲日产国码是AV | 久久这里只精品国产99热| 97久久天天综合色天天综合色hd| 久久天天婷婷五月俺也去| 人人狠狠综合久久亚洲高清| 欧美久久久久久精选9999| 久久久人妻精品无码一区| 久久久久国产精品麻豆AR影院| 国产精品九九久久精品女同亚洲欧美日韩综合区| 久久妇女高潮几次MBA| 亚洲精品美女久久久久99| 久久精品人人做人人爽电影蜜月| 亚洲AV成人无码久久精品老人| 无码人妻精品一区二区三区久久| 久久婷婷五月综合97色直播|