• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

        基于MySQL的高性能數(shù)據(jù)庫應(yīng)用開發(fā)(運(yùn)用C++設(shè)置MYSQL)

        基于MySQL的高性能數(shù)據(jù)庫應(yīng)用開發(fā)(運(yùn)用C++設(shè)置MYSQL)

        更新時(shí)間:2022-05-05 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

        基于MySQL的高性能數(shù)據(jù)庫應(yīng)用開發(fā)


        一、高性能數(shù)據(jù)庫的選擇


        ---- 在數(shù)據(jù)庫的應(yīng)用開發(fā)中,常常會(huì)遇到性能和代價(jià)的之間矛盾。以作者在開發(fā)股市行
        情查詢和交易系統(tǒng)中遇到的問題為例,要在實(shí)時(shí)記錄1000多只股票每分鐘更新一次的行
        情數(shù)據(jù)的同時(shí),響應(yīng)大量并發(fā)用戶的數(shù)據(jù)查詢請(qǐng)求。考慮到性價(jià)比和易維護(hù)性,系統(tǒng)又
        要求在基于PC服務(wù)器,Windows NT平臺(tái)的軟硬件環(huán)境下實(shí)現(xiàn)。開始,我們采用了MS SQL
        Server 6.5 作為數(shù)據(jù)庫系統(tǒng),用Visual C++ 6.0開發(fā)了訪問數(shù)據(jù)庫的前端,應(yīng)用ODBC
        數(shù)據(jù)接口,在進(jìn)行了大量的數(shù)據(jù)庫配置和程序優(yōu)化后,發(fā)現(xiàn)仍不能滿足性能要求。后采
        用SQL Server的DB-Library接口,繞過了ODBC解釋層,可以每秒更新行情數(shù)據(jù)30次,同
        時(shí)支持20-30個(gè)左右的并發(fā)用戶進(jìn)行行情查詢,基本滿足要求(單臺(tái)PC服務(wù)器,單PII3
        50 CPU,內(nèi)存128M,SCSI硬盤)。有沒有可能進(jìn)一步提高系統(tǒng)的性能和負(fù)載能力呢?經(jīng)
        過分析,數(shù)據(jù)庫服務(wù)器是系統(tǒng)的瓶頸。當(dāng)然,可以采用UNIX服務(wù)器+大型數(shù)據(jù)庫的系統(tǒng)
        平臺(tái),但其開發(fā)、運(yùn)行、維護(hù)的費(fèi)用比微機(jī)+Windows NT平臺(tái)的費(fèi)用高出數(shù)倍。我們?cè)?
        其它一些系統(tǒng)的開發(fā)中,也經(jīng)常遇到這樣的矛盾。如何在微機(jī)平臺(tái)上建立大容量、高效
        率、易維護(hù)、高性價(jià)比的數(shù)據(jù)庫系統(tǒng)呢?
        ---- 考察國內(nèi)基于微機(jī)平臺(tái)的數(shù)據(jù)庫應(yīng)用系統(tǒng),典型的如網(wǎng)易的分布式郵件系統(tǒng),采用
        了FreeBSD+MySQL的平臺(tái),其容量、負(fù)載能力和響應(yīng)速度都很優(yōu)秀。作者查閱了MySQL的
        相關(guān)文檔,發(fā)現(xiàn)MySQL是GNU軟件(即OpenSource自由軟件)中非常優(yōu)秀的數(shù)據(jù)庫系統(tǒng),
        它完全符合SQL92 (Entry level)和 ODBC( level 0-2)規(guī)范,在符合POSIX規(guī)范的操
        作系統(tǒng)上實(shí)現(xiàn)了非常高效的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。根據(jù)MySQL提供的文檔,它的數(shù)據(jù)操
        作堪稱所有數(shù)據(jù)庫中最高效的,Benchmark如下表:
        Reading 2000000 rows by index
        Database Seconds
        mysql 367
        mysql_odbc 464
        db2_odbc 1206
        informix_odbc 121126
        ms-sql_odbc 1634
        oracle_odbc 20800
        solid_odbc 877
        sybase_odbc 17614
        Inserting (350768) rows
        Database Seconds
        mysql 381
        mysql_odbc 619
        db2_odbc 3460
        informix_odbc 2692
        ms-sql_odbc 4012
        oracle_odbc 11291
        solid_odbc 1801
        sybase_odbc 4802
        (run on the same NT 4.0 machine)
        ---- 從MySQL的Benchmark中可以看到,MySQL的性能非常出眾(當(dāng)然,測試的MySQL系統(tǒng)
        可能作了優(yōu)化,被測數(shù)據(jù)可能是針對(duì)MySQL選擇的),而且MySQL提供了對(duì)Windows NT的
        支持。Windows NT+MySQL能否成為構(gòu)建高性能數(shù)據(jù)庫應(yīng)用的理想選擇呢?作者用MySQL
        的數(shù)據(jù)接口改寫了程序,經(jīng)過一段時(shí)間的運(yùn)行,證明MySQL確實(shí)是高效而穩(wěn)定的數(shù)據(jù)庫,
        非常適合構(gòu)建大容量、高效率、易維護(hù)、高性價(jià)比的數(shù)據(jù)庫應(yīng)用系統(tǒng)。現(xiàn)將MySQL的安裝
        、運(yùn)行、開發(fā)的心得與大家共享。

        二、MySQL的安裝和運(yùn)行
        ---- 首先從http://www.mysql.com/(國內(nèi)用戶可以從http://www.freecode.com.cn/m
        irror/mysql/)下載MySQL的執(zhí)行代碼及源代碼。注意,Windows NT用戶要選擇NT下的執(zhí)
        行代碼,我下載的是mysql-shareware-3.22.32-win.zip。解包后執(zhí)行Setup,按屏幕提
        示即可完成安裝。
        ---- 拷貝MySQL根目錄(c:\mysql)下的my-example.cnf到c:\my.cnf,按文件中的提示
        編輯my.cnf(如果MySQL的根目錄是c:\mysql,可暫不改動(dòng)my.cnf)。在NT的控制臺(tái)窗口
        中,進(jìn)入MySQL的執(zhí)行目錄(c:\mysql\bin),執(zhí)行
        ---- C:\mysql\bin\mysqld-shareware --standalone
        ---- 則MySQL的數(shù)據(jù)庫引擎啟動(dòng)。打開另一NT控制臺(tái)窗口,執(zhí)行
        ---- C:\mysql\bin\mysql mysql
        ---- 建立數(shù)據(jù)庫連接,出現(xiàn)“mysql>”提示符后,執(zhí)行
        ---- mysql > DELETE FROM user WHERE Host='localhost' AND User='';
        ---- mysql > QUIT
        ---- 刪除所有的非授權(quán)用戶。
        ---- 然后執(zhí)行
        ---- C:\mysql\bin\mysqladmin reload
        ---- C:\mysql\bin\mysqladmin -u root password your_password
        ---- 其中,your_password是你選擇的數(shù)據(jù)庫管理員的口令,必須妥善保管。
        ---- 如果要每次都以管理員身份連接數(shù)據(jù)庫,則編輯c:\my.cnf,在[client]段中加入

        user=root
        password= your_password
        如果要停止MySQL的數(shù)據(jù)庫引擎,可以執(zhí)行
        C:\mysql\bin\mysqladmin -u=root -p shutdown
        按提示輸入管理員口令后,MySQL的數(shù)據(jù)庫引擎停止。

        三、MySQL客戶端應(yīng)用的開發(fā)
        ---- MySQL提供了豐富的數(shù)據(jù)接口API,包括C、C++、Perl、PHP、Python、TCL等API和
        JDBC,ODBC接口。出于性能考慮,我們采用了MySQL的C API進(jìn)行開發(fā)。現(xiàn)以Visual C++
        環(huán)境為例,作一簡單介紹。
        ---- 新建一Win32 Console Application的Project,把“c:\mysql\include”添加到編
        譯選項(xiàng)的包含路徑中(在Project Options中加入 /I "d:\mysql\include")。新建一m
        ain.c文件,主體如下:
        #include <windows.h>
        #include <stdio.h>
        #include <string.h>
        #include <mysql.h>
        int main( int argc, char * argv[] )
        {
         char szTargetDSN[] = "test";
        char szSqlText[500]="";
        char aszFlds[ 25 ][ 25 ];
        MYSQL* myData ;
        MYSQL_RES * res ;
        MYSQL_FIELD * fd ;
        MYSQL_ROW row ;
        int i,j,k;
        BOOLbCreate = TRUE;
        if ( (myData = mysql_init((MYSQL*) 0))
         //初始化數(shù)據(jù)結(jié)構(gòu)
         && mysql_real_connect( myData, NULL,
         //連接數(shù)據(jù)庫
        "root", " your_password ", szTargetDSN,
        MYSQL_PORT, NULL, 0 ) )
        {
        if(bCreate)
        {
        sprintf(szSqlText, //構(gòu)造SQL語句
        "create table mytable "
        //新建一張表
        "(time datetime, s1 char(6), "
        "s2 char(11), s3 int, s4 int)");
        if (mysql_query( myData, szSqlText))
        //執(zhí)行SQL語句
        {//執(zhí)行SQL語句出錯(cuò)
        ErrLog( "Can't create table") ;
        mysql_close( myData ) ;
        return FALSE ;
        }

        sprintf(szSqlText,
        "insert into mytable "
         //向表中插入數(shù)據(jù)
        "values('2000-3-10 21:01:30',"
        //注意時(shí)間的格式
        "'Test','MySQLTest',2000,3)");
        if (mysql_query( myData, szSqlText))
         {//執(zhí)行SQL語句出錯(cuò)
        ErrLog( "Can't insert data to table") ;
        mysql_close( myData ) ;
        return FALSE ;
         }
        sprintf(szSqlText, "select * from mytable ");
         if (mysql_query( myData, szSqlText))
        //進(jìn)行數(shù)據(jù)檢索
         {
        //執(zhí)行SQL語句出錯(cuò)
        mysql_close( myData ) ;
        return FALSE ;
         }
         else
         {
        res = mysql_store_result( myData ) ;
        //取得查詢結(jié)果
        i = (int) mysql_num_rows( res ) ;
        //取得有效記錄數(shù)
        printf( "Query: %s\n%ld records found:
         \n", szSqlText, i ) ;
         for ( i = 0 ; fd = mysql_fetch_field( res ) ;
        i++ )
        strcpy( aszFlds[ i ], fd->name ) ;
        //取得各字段名
        for (i=1; row = mysql_fetch_row( res ); )
        //依次讀取各條記錄
        {j = mysql_num_fields( res ) ;
        //取得記錄中的字段數(shù)
        printf( "Record #%ld:-\n", i++ ) ;
        for ( k = 0 ; k < j ; k++ )
        //輸出各字段的值
        printf( "Fld #%d (%s): %s\n", k + 1, aszFlds[ k ],
        (((row[k]==NULL)||
         (!strlen(row[k])))?"NULL":row[k])) ;
        puts( "==============================\n" ) ;
        }
        mysql_free_result( res ) ;
         }
        }
        else
        {//連接數(shù)據(jù)庫出錯(cuò)
        ErrLog( "Can't connect to the mysql server ") ;
        mysql_close( myData ) ;
        return FALSE ;
        }
        mysql_close( myData ) ;
         return TRUE ;
        }
        ---- 對(duì)其中幾個(gè)函數(shù)作簡單說明,詳細(xì)說明,可參考MySQL文檔:
        ---- 1. MYSQL *mysql_init(MYSQL *mysql)
        ---- 初始化一個(gè)類型為MYSQL的數(shù)據(jù)結(jié)構(gòu),為執(zhí)行mysql_real_connect()做準(zhǔn)備。參數(shù)
        mysql為指向該結(jié)構(gòu)的指針,如果mysql為NULL,則新建并初始化一個(gè)MYSQL的數(shù)據(jù)結(jié)構(gòu)。
        新建的結(jié)構(gòu)將在mysql_close()中釋放。
        ---- 若成功,返回初始化的MYSQL數(shù)據(jù)結(jié)構(gòu)的指針,否則返回NULL。
        ---- 2. MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
        ---- const char *user, const char *passwd, const char *db,
        ---- unsigned int port, const char *unix_socket, unsigned int client_flag)
        ---- 與MySQL數(shù)據(jù)庫引擎建立連接。在執(zhí)行進(jìn)一步的數(shù)據(jù)操作之前,必須保證mysql_re
        al_connect()成功返回。
        ---- 參數(shù)mysql是mysql_init()的返回值;
        ---- 參數(shù)host是運(yùn)行MySQL數(shù)據(jù)庫引擎的機(jī)器的TCP/IP主機(jī)名,如為NULL則默認(rèn)為“l(fā)o
        calhost”;
        ---- 參數(shù)user和passwd是MySQL數(shù)據(jù)庫的合法用戶和口令;
        ---- 參數(shù)db是連接的數(shù)據(jù)庫名;
        ---- 參數(shù)port,unix_socket和client_flag一般取默認(rèn)值。
        ---- 3. int mysql_query(MYSQL *mysql, const char *query)
        ---- 執(zhí)行query字符串中的SQL語句,query必須以0結(jié)尾。如果成功,返回0。
        ---- 4. MYSQL_RES *mysql_store_result(MYSQL *mysql)
        ---- 返回SELECT,SHOW,DESCRIBE, EXPLAIN等語句執(zhí)行的結(jié)果。函數(shù)新建一個(gè)MYSQL_
        RES的數(shù)據(jù)結(jié)構(gòu),把結(jié)果存儲(chǔ)在該結(jié)構(gòu)中。如果查詢沒有匹配的結(jié)果,則返回空數(shù)據(jù)集。
        處理完結(jié)果集后,必須調(diào)用mysql_free_result()。
        ---- 如果出錯(cuò),返回NULL,否則返回MYSQL_RES結(jié)構(gòu)的指針。
        ---- 5. MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
        ---- 取回結(jié)果集中的下一條記錄,如果沒有記錄或出錯(cuò),返回NULL。一條記錄中的字段
        數(shù)可以用mysql_num_fields(result)獲得,各字段的值可以用row[0] 到 row[mysql_nu
        m_fields(result)-1]的數(shù)組來訪問。
        ---- 在工程的鏈接選項(xiàng)中,加入c:\mysql\lib\libmysql.lib的接口庫,把libmysql.d
        ll復(fù)制到操作系統(tǒng)的system目錄下(c:\winnt\system32),就可以編譯運(yùn)行了。
        ---- 到這里,一個(gè)簡單的數(shù)據(jù)庫應(yīng)用就開發(fā)完成了。當(dāng)然,MySQL有一套功能豐富的AP
        I,大家可以查看文檔。另外,如果需要跨平臺(tái)的移植性,可以考慮用MySQL的ODBC接口
        。可以自己配置MySQL的ODBC連接屬性,也可以下載myodbc-2.50.29-nt.zip工具包來配
        置。

        四、總結(jié)
        ---- 作者用MySQL在Windows NT上構(gòu)建了高性能、高穩(wěn)定性的數(shù)據(jù)庫系統(tǒng)。這樣,既可
        以利用Windows NT和Visual C++的友好界面,又可以獲得MySQL的強(qiáng)大功能。實(shí)踐證明,
        這種方案成本低(別忘了MySQL是免費(fèi)的)、效率高、開發(fā)周期短、運(yùn)行穩(wěn)定(MySQL的
        穩(wěn)定性在Yahoo、163、263等站點(diǎn)獲得了極高的評(píng)價(jià))。
        ---- 目前,我的股市行情查詢和交易系統(tǒng)已經(jīng)獲得了每秒鐘記錄70-100條股票行情數(shù)
        據(jù),同時(shí)響應(yīng)50個(gè)并發(fā)用戶進(jìn)行數(shù)據(jù)查詢的性能,而系統(tǒng)的開發(fā)、運(yùn)行成本卻大幅降低
        。如果您正為PC上的數(shù)據(jù)庫效率發(fā)愁,不妨也來試試MySQL吧。


        溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 国产日产亚洲系列最新| 亚洲夂夂婷婷色拍WW47| 一级毛片a免费播放王色| 免费国产成人午夜电影| 亚洲av无码专区在线电影| 免费看www视频| 美女视频黄a视频全免费网站一区 美女视频黄a视频全免费网站色 | 最新亚洲精品国偷自产在线| 国产啪精品视频网免费| 亚洲中文字幕无码中文字| 午夜dj免费在线观看| 看全免费的一级毛片| 国产亚洲一区二区三区在线不卡| 一级毛片免费毛片毛片| 亚洲成av人在线视| 1000部拍拍拍18免费网站| 亚洲色偷偷色噜噜狠狠99| 五月婷婷亚洲综合| 中文字幕在线观看免费| 亚洲视频在线观看免费| 人妻视频一区二区三区免费| 亚洲av无码专区首页| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲中文字幕在线第六区| 一区二区三区无码视频免费福利| 亚洲天天做日日做天天欢毛片| 成人免费AA片在线观看| 免费人成再在线观看网站| 亚洲国产成人久久精品动漫 | jiz zz在亚洲| 国产成人高清亚洲| 中文在线免费不卡视频| 亚洲日本在线播放| 亚洲 无码 在线 专区| 久久午夜无码免费| 亚洲AV成人无码久久WWW| 国产亚洲av片在线观看16女人 | 亚洲天天在线日亚洲洲精| 日韩中文无码有码免费视频| 国产一区二区三区免费观在线| 亚洲精品国产啊女成拍色拍|