Как я могу избежать повторного использования mysql_real_connect () для каждого запроса? - PullRequest
2 голосов
/ 28 мая 2011

Я запрашиваю свою базу данных через соединитель, который я сделал в Lazarus / Freepascal.Он использует libmysql из MySQL 5.0.Из того, что я могу сказать, функции, которые я могу вызвать, идентичны функциям MYSQL C Connector.

База данных не для удаленного доступа;это доступная по конвейеру база данных, которую я пытаюсь оптимизировать для локального чтения с использованием таблиц только для памяти (без MyISAM или InnoDB).Основное внимание уделяется скорости.

Клиентское приложение написано на ограниченном языке сценариев, называемом MQL4 (для финансовых рынков), и использует мою библиотеку для многократного запроса базы данных и возврата результатов для анализа.

Проблема: Я вынужден уничтожать и заново создавать соединение с базой данных каждый раз, когда отправляю новый запрос.

Если я не уничтожу и не воссоздаю соединение, я получу нарушение прав на чтение, потому что моя библиотека соединителей теряет значение *MYSQL, присвоенное mysql_real_connect().

Я бы прошелэто значение через мое клиентское приложение, но, к сожалению, оно написано на языке, который может обрабатывать только типы данных LongInt, Double и String.

Я пытался передать значение через преобразование моего клиентского приложения в LongInt, а затем преобразовал его обратно *MYSQL в моей библиотеке, но это не сработало.

Честно говоря, я не понимаю, почему моя библиотека теряет значение для *MYSQL.

Вот код моей библиотеки:

{$CALLING STDCALL}

library D1Query;

{$mode objfpc}{$H+}

uses
  cmem, Windows, SysUtils, mysql50;

var
  sock: PMYSQL;
  qmysql: st_mysql;

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

  procedure InitSQL; stdcall;
  begin
    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
    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);
    Result := i;   
  end;

exports
  SQL_Query, InitSQL, DeInitSQL;

begin
end.

1 Ответ

1 голос
/ 30 мая 2011

Майк, я бы порекомендовал использовать ZEOS 6.6.6 для подключения к MySQL.

Таким образом, вам не нужно копаться в низкоуровневом коде, но вы можете просто использовать стандартные элементы управления ZEOS: TZConnection TZQuery и т. Д.

Вот инструкция для ZEOS в Lazarus: http://wiki.lazarus.freepascal.org/Zeos_tutorial
И вы можете скачать пакет ZEOS
здесь: http://sourceforge.net/projects/zeoslib/files/Zeos%20Database%20Objects/zeosdbo-6.6.6-stable/ZEOSDBO-6.6.6-stable.zip/download
Скачайте zip-файл и установите пакет для lazarus.

Справочные файлы можно найти здесь: http://sourceforge.net/projects/zeoslib/files/Zeos%20Database%20Objects/zeosdbo-6.6.6-stable/

Удачи.

...