Запрашивает MYSQL из внешнего приложения (мой код неэффективен)? - PullRequest
0 голосов
/ 25 мая 2011

У меня есть база данных, которую мне нужно запрашивать снова и снова как можно быстрее.Мои запросы выполняются довольно быстро, но, похоже, есть дополнительное отставание.

У меня такое ощущение, что это отставание связано с тем, что я каждый раз инициирую и деинициализирую соединение.Есть ли способ избежать этого?

Я не использую libmysql (по крайней мере, не напрямую).Я использую пакет «mysql50» в Lazarus / FreePascal (по аналогии с 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.

1 Ответ

0 голосов
/ 25 октября 2011

Вы можете использовать блоки инициализации и финализации для настройки и разрыва соединения SQL. Таким образом вы снимаете накладные расходы на установку соединения с каждого выполняемого запроса. Вы можете найти больше информации об инициализации и финализации здесь .

Из ссылки:

Блок инициализации используется для инициализации определенных переменных или выполнения кода, необходимого для правильного функционирования устройства. Части инициализации модулей выполняются в том порядке, в котором компилятор загружал модули при компиляции программы. Они выполняются до выполнения первой инструкции программы.

Финализация части блоков выполняются в обратном порядке выполнения инициализации. Они используются, например, для очистки любых ресурсов, выделенных в части инициализации модуля или во время жизни программы. Часть завершения всегда выполняется в случае обычного завершения программы: будь то потому, что в программном коде достигнут конечный конец или потому, что где-то была выполнена инструкция Halt.

...