Ваш второй фрагмент кода неверен.Вы перезаписываете новое соединение глобальным соединением, когда вы должны копировать строку соединения.Вы также освобождаете тот глобальный объект, который, вероятно, вызовет проблемы для остальной части вашего приложения.Примерно так, в зависимости от деталей вашего класса 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;
Вам нужно будет сделать нечто подобное, если вы напишите свой собственный поток или пул соединений.