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;
싱글 톤을 사용하는 경우 GetConnectionPool 함수를 사용하여 인스턴스를 검색 할 수 있습니다. 이 기능은 ThreadedConnections.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;