FireDac沒有簡單的方法來支持螺紋連接。默認情況下,FireDac連接不是線程安全。這意味著,如果您嘗試同時使用相同的連接在數據庫中使用多個線程進行操作,則可以(通常)會導致例外。該庫通過連接池包含了解決方案,從而使其更容易。
連接池假定您正在使用連接定義。這很容易實現,即使默認未使用,甚至動態地實現。可以在應用程序的主要形式中找到一個示例。連接池可用於請求連接。池檢查線程是否已經存在連接和給定的連接定義。如果是這樣,將返回連接,如果沒有,則將創建和註冊。為了在申請執行過程中保持正確的態度,已經添加了單身人士的實現。
您可以在連接池中註冊默認連接定義的名稱,因此您無需每次指定它。請求連接的線程的ID也可以由池自動確定。
還有一個用於使用連接池的線程的基類。還包括一個使用此基類的示例,並以應用程序的主要形式進行處理。
在您的項目或數據模塊中包含ThreadedConnections.Singleton 。調用SetConnectionPoolDefaults方法以初始化連接池的單例。例如:
SetConnectionPoolDefaults('SQLite', 'MainDatabase');
在此示例中, 'SQLite'是驅動程序和'MainDatabase'連接定義的名稱。
如果不使用連接定義,則可以使用與連接相同的參數輕鬆地動態創建它們。以下示例假設有一個稱為dmDatabase.DbConnection的連接。
const DefinitionName = 'MainDatabase';
var Definition := FDManager.ConnectionDefs.FindConnectionDef(DefinitionName);
if not Assigned(Definition) then
begin
var Connection := dmDatabase.DbConnection;
FDManager.AddConnectionDef(DefinitionName, Connection.ActualDriverID, Connection.Params);
end;
使用Singleton時,可以使用GetConnectionPool函數檢索其實例。此功能可在ThreadedConnections.Singleton中可用。 Singleton單元。池可以訪問許多GetConnection函數來請求連接。 NO參數變體假設您正在為默認連接定義和當前線程執行此操作。這也可以是主線程。
var Pool := GetConnectionPool;
var DefaultConnection := Pool.GetConnection;
var SpecificConnection := Pool.GetConnection('FinancialDatabase', Self.ThreadID);
您可以將TThreadedConnectionThread用作線程的超類。該課程期望創建的連接池的實例。它提供了標準功能,可以輕鬆獲得子類中的連接。一個示例可以在ThreadedConnections.Example.Threads中找到。當然,也可以將超級階級用作在您自己的超級類別中實現的示例。
這是一個示例,如何在使用TThreadedConnectionThread用作超類時使用它:
TMyDatabaseThread = class(TThreadedConnectionThread)
protected
procedure Execute; override;
end;
TMyDatabaseThread.Execute;
begin
var Query := TFDQuery.Create;
try
Query.Connection := GetConnection;
...
finally
Query.Free;
end;
end;
var Thread := TMyDatabaseThread.Create(True, GetConnectionPool);
Thread.Start;