Tidak ada cara mudah di FireDac untuk mendukung koneksi berulir. Secara default, koneksi firedac tidak aman. Ini berarti bahwa jika Anda mencoba melakukan hal -hal dalam database dengan beberapa utas secara bersamaan, menggunakan koneksi yang sama, ini dapat (dan biasanya akan) menghasilkan pengecualian. Perpustakaan ini berisi solusi untuk ini melalui kumpulan koneksi yang membuat ini lebih mudah.
Kumpulan koneksi mengasumsikan bahwa Anda bekerja dengan definisi koneksi. Ini mudah diimplementasikan, bahkan secara dinamis jika tidak digunakan secara default. Contoh dapat ditemukan dalam bentuk utama aplikasi. Kumpulan koneksi dapat digunakan untuk meminta koneksi. Pool memeriksa untuk melihat apakah koneksi sudah ada untuk utas dan definisi koneksi yang diberikan. Jika demikian, koneksi dikembalikan, jika tidak, itu dibuat dan terdaftar. Untuk menjaga administrasi ini benar selama pelaksanaan aplikasi, implementasi singleton telah ditambahkan.
Anda dapat mendaftarkan nama untuk definisi koneksi default di kumpulan koneksi, jadi Anda tidak perlu menentukannya setiap kali. ID utas yang meminta koneksi juga dapat secara otomatis ditentukan oleh kumpulan.
Ada juga kelas dasar untuk utas yang ingin menggunakan kumpulan koneksi. Contoh menggunakan kelas dasar ini juga disertakan, dan berhasil dalam bentuk utama aplikasi.
Sertakan ThreadedConnections.Singleton dalam proyek atau modul data Anda. Hubungi metode SetConnectionPoolDefaults untuk menginisialisasi singleton untuk kumpulan koneksi. Misalnya:
SetConnectionPoolDefaults('SQLite', 'MainDatabase');
Dalam contoh ini, 'SQLite' adalah driver dan 'MainDatabase' nama definisi koneksi Anda.
Jika definisi koneksi tidak digunakan, Anda dapat dengan mudah membuatnya secara dinamis menggunakan parameter yang sama dengan koneksi Anda. Contoh berikut mengasumsikan bahwa ada koneksi yang disebut 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;
Saat menggunakan singleton, contohnya dapat diambil menggunakan fungsi GetConnectionPool . Fungsi ini tersedia di unit ThreadedConnections.Singleton . Pool memiliki akses ke sejumlah fungsi GetConnection untuk meminta koneksi. Varian No Parameter mengasumsikan bahwa Anda melakukan ini untuk definisi koneksi default dan untuk utas saat ini. Ini juga bisa menjadi utas utama.
var Pool := GetConnectionPool;
var DefaultConnection := Pool.GetConnection;
var SpecificConnection := Pool.GetConnection('FinancialDatabase', Self.ThreadID);
Anda dapat menggunakan TThreadedConnectionThread sebagai superclass untuk utas Anda. Kelas ini mengharapkan instance dari kumpulan koneksi saat pembuatan. Ini menyediakan fungsi standar untuk dengan mudah mendapatkan koneksi di subkelas. Contohnya dapat ditemukan di ThreadedConnections.Example.Threads . Tentu saja, dimungkinkan juga untuk menggunakan superclass sebagai contoh untuk implementasi di superclass Anda sendiri untuk utas.
Berikut adalah contoh cara menggunakannya saat menggunakan TThreadedConnectionThread sebagai 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;