我有一个数据库,我需要尽快反复查询。我的查询执行得非常快,但似乎还有一些额外的延迟。
我感觉这种滞后是由于我每次启动和取消连接连接这一事实。有没有办法避免这种情况?
我没有使用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.
答案 0 :(得分:0)
您可以使用Initialization和Finalization块来处理SQL连接的设置和拆除。这样您就可以从执行的每个查询中删除连接设置的开销。您可以在初始化和最终确定here找到更多信息。
从链接:
初始化块用于初始化某些变量或执行正确运行单元所需的代码。单元的初始化部分按编译器在编译程序时加载单元的顺序执行。它们在程序的第一个语句执行之前执行。
单元的最终化部分以初始化执行的相反顺序执行。例如,它们用于清除在单元的初始化部分中分配的任何资源,或者在程序的生命周期内。在正常的程序终止的情况下总是执行终结部分:是否是因为在程序代码中到达了最终结束,还是因为在某处执行了Halt指令。