0

我有一个数据库,我需要尽可能快地反复查询。我的查询执行得很快,但似乎还有一些额外的滞后。

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

我没有使用 libmysql(至少,不是直接使用)。我在 Lazarus/FreePascal 中使用“mysql50”包(类似于 delphi),它又使用 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 回答