لا توجد طريقة سهلة في Firedac لدعم الاتصالات الخيطية. بشكل افتراضي ، فإن اتصال FireDac ليس آمنًا للمعلومات. هذا يعني أنه إذا حاولت القيام بالأشياء في قاعدة البيانات مع مؤشرات ترابط متعددة في نفس الوقت ، باستخدام نفس الاتصال ، يمكن أن يؤدي ذلك (وعادة ما) إلى استثناءات. تحتوي هذه المكتبة على حل لهذا عبر تجمع اتصال يجعل هذا أسهل.
يفترض مجموعة الاتصال أنك تعمل مع تعريفات الاتصال. هذا سهل التنفيذ ، حتى ديناميكيًا إذا لم يتم استخدامه افتراضيًا. يمكن العثور على مثال في الشكل الرئيسي للتطبيق. يمكن استخدام تجمع الاتصال لطلب اتصال. يتحقق المجموعة لمعرفة ما إذا كان هناك اتصال موجود بالفعل للمعلومات وتعريف الاتصال المحدد. إذا كان الأمر كذلك ، يتم إرجاع الاتصال ، إن لم يكن ، يتم إنشاؤه وتسجيله. للحفاظ على صحة هذه الإدارة أثناء تنفيذ التطبيق ، تمت إضافة تطبيق مفردة.
يمكنك تسجيل اسم لتعريف الاتصال الافتراضي في مجموعة الاتصال ، لذلك لا يتعين عليك تحديده في كل مرة. يمكن أيضًا تحديد معرف الخيط الذي يطلب اتصالًا تلقائيًا بواسطة التجمع.
هناك أيضًا فئة أساسية للخيوط التي ترغب في استخدام تجمع الاتصال. مثال على استخدام هذه الفئة الأساسية يتم تضمينه أيضًا ، ويتم وضعه في الشكل الرئيسي للتطبيق.
قم بتضمين 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 . يحتوي المجمع على إمكانية الوصول إلى عدد من وظائف 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;