2011-05-25 98 views
0

我有一個數據庫,我需要儘可能快地查詢一遍又一遍。我的查詢執行得很快,但似乎有一些額外的滯後。從外部應用程序查詢MYSQL(是我的代碼效率低下)?

我有一種感覺,這種滯後是由於我每次啓動和取消啓動連接連接的事實。有沒有辦法避免這種情況?

我沒有使用libmysql(至少不是直接)。我在Lazarus/FreePascal(類似於delphi)中使用「mysql50」包,後者又使用libmysql(我認爲)。

如果有人看了我的代碼並指出(或者甚至是固定的)一些低效率,我將非常感激。

這個庫的目的是傳遞從MQL4發出的查詢(一種用於金融交易市場的類似C語言),並從我的MYSQL數據庫(通過管道連接到它)返回一行, 。

{$CALLING STDCALL} 

library D1Query; 

{$mode objfpc}{$H+} 

uses 
    cmem, 
    Windows, 
    SysUtils, 
    profs_win32exceptiontrap, 
    mysql50; 

var 

    sock: PMYSQL; 
    qmysql: st_mysql; 

type 
    VArray = array[0..100] of Double; 
    PArray = ^VArray; 


    procedure InitSQL; stdcall; 
    begin 

    mysql_init(PMySQL(@qmysql)); 
    sock := 
     mysql_real_connect(PMysql(@qmysql), '.', 'root', 'password', 'data', 3306, 'mysql', CLIENT_MULTI_STATEMENTS); 
    if sock = nil then 
    begin 
     OutputDebugString(PChar(' Couldn''t connect to MySQL.')); 
     OutputDebugString(PChar(mysql_error(@qmysql))); 
     halt(1); 
    end; 

    end; 

    procedure DeInitSQL; stdcall; 
    begin 

    mysql_close(sock); 
    end; 

    function SQL_Query(QRY: PChar; output: PArray): integer; stdcall; 
    var 
    rowbuf: MYSQL_ROW; 
    recbuf: PMYSQL_RES; 
    i: integer; 
    nfields: LongWord; 


    begin 
    InitSQL(); 

    if (mysql_query(sock, QRY) < 0) then 
    begin 
     OutputDebugString(PChar(' Query failed ')); 
     OutputDebugString(PChar(' ' + mysql_error(sock))); 
    end; 

    recbuf := mysql_store_result(sock); 
    nfields := mysql_num_fields(recbuf); 
    rowbuf := mysql_fetch_row(recbuf); 


    if (rowbuf <> nil) then 
    begin 
     for i:=0 to nfields-1 do 
      output^[i] := StrToFloatDef(rowbuf[i], -666); 
    end; 

    mysql_free_result(recbuf); 
    DeInitSQL(); 
    Result := i; 


    end; 

exports 
    SQL_Query, 
    InitSQL, 
    DeInitSQL; 

begin 
end. 
+0

本應該去代碼審查 – Ibu 2011-05-25 05:08:41

+0

嗯,我根本不知道存在。 – 2011-05-25 05:29:48

回答

0

你可以使用的初始化和結束塊來處理建立和拆除SQL連接。這樣您可以從執行的每個查詢中刪除連接設置的開銷。您可以在初始化和定稿here上找到更多信息。

從鏈接:

初始化塊用於初始化某些變量或執行代碼所必需的單元的正確運行。單元的初始化部分按編譯器在編譯程序時加載單元的順序執行。它們在程序的第一條語句執行之前執行。

單元的最終化部分以與初始化執行相反的順序執行。它們用於清理在單元初始化部分分配的任何資源,或者在程序生命週期中清理所有資源。終止部分總是在正常程序終止的情況下執行:無論是因爲在程序代碼中達到最終結束還是因爲在某處執行了暫停指令。