ไม่มีวิธีง่ายๆใน FireDac เพื่อรองรับการเชื่อมต่อแบบเกลียว โดยค่าเริ่มต้นการเชื่อมต่อ FireDAC ไม่ปลอดภัยกับเธรด ซึ่งหมายความว่าหากคุณพยายามทำสิ่งต่าง ๆ ในฐานข้อมูลที่มีหลายเธรดในเวลาเดียวกันโดยใช้การเชื่อมต่อเดียวกันสามารถ (และมักจะ) จะส่งผลให้เกิดข้อยกเว้น ไลบรารีนี้มีวิธีแก้ปัญหานี้ผ่านพูลเชื่อมต่อที่ทำให้ง่ายขึ้น
กลุ่มการเชื่อมต่อถือว่าคุณกำลังทำงานกับคำจำกัดความการเชื่อมต่อ นี่เป็นเรื่องง่ายที่จะนำไปใช้แม้กระทั่งแบบไดนามิกหากไม่ได้ใช้โดยค่าเริ่มต้น ตัวอย่างสามารถพบได้ในรูปแบบหลักของแอปพลิเคชัน พูลการเชื่อมต่อสามารถใช้เพื่อขอการเชื่อมต่อ พูลตรวจสอบเพื่อดูว่ามีการเชื่อมต่ออยู่แล้วสำหรับเธรดและนิยามการเชื่อมต่อที่กำหนดหรือไม่ ถ้าเป็นเช่นนั้นการเชื่อมต่อจะถูกส่งคืนหากไม่ได้สร้างและลงทะเบียน เพื่อให้การดูแลระบบนี้ถูกต้องในระหว่างการดำเนินการแอปพลิเคชันได้มีการเพิ่มการใช้งาน Singleton
คุณสามารถลงทะเบียนชื่อสำหรับนิยามการเชื่อมต่อเริ่มต้นในพูลการเชื่อมต่อดังนั้นคุณไม่จำเป็นต้องระบุในแต่ละครั้ง ID ของเธรดที่ร้องขอการเชื่อมต่อสามารถกำหนดได้โดยอัตโนมัติโดยพูล
นอกจากนี้ยังมีคลาสพื้นฐานสำหรับเธรดที่ต้องการใช้พูลการเชื่อมต่อ ตัวอย่างการใช้คลาสฐานนี้รวมอยู่ด้วยและทำงานในรูปแบบหลักของแอปพลิเคชัน
รวม ThreadedConnections.Singleton ในโครงการหรือโมดูลข้อมูลของคุณ เรียกเมธอด SetConnectionPoolDefaults เพื่อเริ่มต้น Singleton สำหรับพูลการเชื่อมต่อ ตัวอย่างเช่น:
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 พูลสามารถเข้าถึงฟังก์ชั่น GetConnection จำนวนหนึ่งเพื่อขอการเชื่อมต่อ ตัวแปรไม่มีพารามิเตอร์จะถือว่าคุณกำลังทำสิ่งนี้สำหรับคำจำกัดความการเชื่อมต่อเริ่มต้นและสำหรับเธรดปัจจุบัน นี่อาจเป็นเธรดหลัก
var Pool := GetConnectionPool;
var DefaultConnection := Pool.GetConnection;
var SpecificConnection := Pool.GetConnection('FinancialDatabase', Self.ThreadID);
คุณสามารถใช้ TThreadedConnectionThread เป็น superclass สำหรับเธรดของคุณ ชั้นเรียนนี้คาดว่าจะมีอินสแตนซ์ของกลุ่มการเชื่อมต่อในการสร้าง มันมีฟังก์ชั่นมาตรฐานเพื่อรับการเชื่อมต่อในคลาสย่อยได้อย่างง่ายดาย ตัวอย่างสิ่งนี้สามารถพบได้ใน ThreadedConnections.Example.Threads แน่นอนว่ามันเป็นไปได้ที่จะใช้ superclass เป็นตัวอย่างสำหรับการใช้งานใน superclass ของคุณเองสำหรับเธรด
นี่คือตัวอย่างวิธีการใช้เมื่อใช้ TThreadedConnectionThread เป็น superclass:
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;