2番目のコードフラグメントが正しくありません。接続文字列をコピーする必要があるときに、グローバル接続で新しい接続を上書きしています。また、そのグローバルを解放しているため、アプリケーションの残りの部分で問題が発生する可能性があります。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;
...
データベース接続プールが必要な場合、接続は通常スレッド固有であるため、非常に注意が必要です。スレッドごとに1つ必要であり、スレッド間でそれらを渡すことはできません。したがって、それをサポートするために多くのコードを書くことになります。
現在、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;
独自のスレッドまたは接続プールを作成する場合は、同様のことを行う必要があります。