0

できるだけ速く何度もクエリを実行する必要があるデータベースがあります。私のクエリはかなり速く実行されますが、さらに遅れがあるようです。

この遅れは、接続を毎回開始および非開始しているためだと感じています。これを回避する方法はありますか?

私は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.
4

1 に答える 1

0

InitializationブロックとFinalizationブロックを使用して、SQL接続のセットアップと切断を処理できます。このようにして、実行する各クエリから接続設定のオーバーヘッドを取り除きます。初期化とファイナライズの詳細については、こちらをご覧ください。

リンクから:

初期化ブロックは、特定の変数を初期化するため、またはユニットが正しく機能するために必要なコードを実行するために使用されます。ユニットの初期化部分は、プログラムのコンパイル時にコンパイラがユニットをロードした順序で実行されます。これらは、プログラムの最初のステートメントが実行される前に実行されます。

ユニットのファイナライズ部分は、初期化実行とは逆の順序で実行されます。これらは、たとえば、ユニットの初期化部分で割り当てられたリソースをクリーンアップするため、またはプログラムの存続期間中に使用されます。ファイナライズ部分は、通常のプログラム終了の場合に常に実行されます。これは、プログラムコードで最終終了に達したためか、停止命令がどこかで実行されたためです。

于 2011-10-25T19:53:20.090 に答える