您的第二个代码片段不正确。当您应该复制连接字符串时,您正在用全局连接覆盖新连接。您还释放了可能会导致应用程序其余部分出现问题的全局变量。像这样,取决于你的 TSQLConnection 类的细节:
SqlCon := TSQLConnection.Create(nil); // create
Qry := TSQLQuery.Create(nil);
try
//SqlCon := FrmConnect.SQLConnection; // overwrite!!!
SqlCon.ConnectionString := FrmConnect.SQLConnection.ConnectionString;
SqlCon.Active := true;
Qry.SQLConnection := SqlCon;
...
如果您想拥有一个数据库连接池,这非常棘手,因为连接通常是特定于线程的 - 每个线程都需要一个,并且不能在线程之间传递它们。所以你最终会写很多代码来支持它。
我现在使用OmniThreadLibrary并有一个返回新数据库连接的工厂方法。这给了我一个线程池,我将任务送入其中,因此我的特定任务在执行时绑定到现有线程,但该线程的寿命相当长。我必须编写的代码非常小(我正在使用 ADO):
type
// a factory to generate new instances of our thread-specific data
IThreadPoolData = interface
['{14917B01-6613-4737-B87E-0046789D4284}']
function GetConnection: TADOConnection;
function GetStoredProc: TADOStoredProc;
end;
TThreadPoolData = class(TInterfacedObject, IThreadPoolData)
strict private
FADOConnection: TADOConnection;
FStoredProc: TADOStoredProc; // lazy creation!
public
constructor Create(aConnectionString: string); overload;
destructor Destroy; override;
function GetConnection: TADOConnection;
function GetStoredProc: TADOStoredProc;
end;
// create the connection here so thread creation is slow but using it
// is (relatively) fast
constructor TThreadPoolData.Create(aConnectionString: string);
begin
FADOConnection := TADOConnection.Create(nil);
FADOConnection.LoginPrompt := false;
FADOConnection.ConnectionString := aConnectionString;
FADOConnection.ConnectOptions := coAsyncConnect;
FADOConnection.Connected := true;
end;
destructor TThreadPoolData.Destroy;
begin
FADOConnection.Connected := false;
if assigned(FStoredProc) then
FreeAndNil(FStoredProc);
FreeAndNil(FADOConnection);
end;
如果您编写自己的线程或连接池,您将需要做类似的事情。