最近使用delphi开发软件中使用6个线程同时操作access数据库,反应经常无规律报错问题,分析可能是在多线程中操作ACCESS数据库存在问题.通过写了一个多线程数据库测试程序,经过测试发现在多线程操作数据库,需要注意以下3点:
1.操作ADO前必须使用 CoInitialize(nil) 和操作完成后使用CoUninitialize
2.必须使用TADOQuery.Create(nil) 不能使用TADOQuery.Create(Self)或TADOQuery.Create(Application)
3.所有线程TADOQuery不能使用同一TADOConnection进行连接,可以这样用 ADOQuery1.ConnectionString := ADOConnection1.ConnectionString;
经过测试,在不注意以上3点情况下,线程执行10ms时,线程开到6时,就会引起内存地址报错了,如果注意以上3点线程可以开到60个线程.长时间运行稳定
正确方法例如:
CoInitialize(nil); //需要引用ActiveX
ADOQuery1 := TADOQuery.Create(nil);
try
with ADOQuery1 do
begin
Close;
ConnectionString := ADOConnection1.ConnectionString;
SQL.Text := 'select * from t_captureimage';
Open;
end;
finally
FreeAndNil(ADOQuery1);
CoUninitialize;
end;
1.操作ADO前必须使用 CoInitialize(nil) 和操作完成后使用CoUninitialize
2.必须使用TADOQuery.Create(nil) 不能使用TADOQuery.Create(Self)或TADOQuery.Create(Application)
3.所有线程TADOQuery不能使用同一TADOConnection进行连接,可以这样用 ADOQuery1.ConnectionString := ADOConnection1.ConnectionString;
经过测试,在不注意以上3点情况下,线程执行10ms时,线程开到6时,就会引起内存地址报错了,如果注意以上3点线程可以开到60个线程.长时间运行稳定
正确方法例如:
CoInitialize(nil); //需要引用ActiveX
ADOQuery1 := TADOQuery.Create(nil);
try
with ADOQuery1 do
begin
Close;
ConnectionString := ADOConnection1.ConnectionString;
SQL.Text := 'select * from t_captureimage';
Open;
end;
finally
FreeAndNil(ADOQuery1);
CoUninitialize;
end;