从外部应用程序查询MYSQL(我的代码效率低下)?

时间:2011-05-25 05:06:03

标签: mysql performance freepascal lazarus mysql-connector

我有一个数据库,我需要尽快反复查询。我的查询执行得非常快,但似乎还有一些额外的延迟。

我感觉这种滞后是由于我每次启动和取消连接连接这一事实。有没有办法避免这种情况?

我没有使用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.

1 个答案:

答案 0 :(得分:0)

您可以使用Initialization和Finalization块来处理SQL连接的设置和拆除。这样您就可以从执行的每个查询中删除连接设置的开销。您可以在初始化和最终确定here找到更多信息。

从链接:

  

初始化块用于初始化某些变量或执行正确运行单元所需的代码。单元的初始化部分按编译器在编译程序时加载单元的顺序执行。它们在程序的第一个语句执行之前执行。

     

单元的最终化部分以初始化执行的相反顺序执行。例如,它们用于清除在单元的初始化部分中分配的任何资源,或者在程序的生命周期内。在正常的程序终止的情况下总是执行终结部分:是否是因为在程序代码中到达了最终结束,还是因为在某处执行了Halt指令。