我正在將我們的客戶端 - 服務器ERP應用程序升級到多層。我們希望爲我們的客戶提供在雲中託管他們數據庫的可能性(託管在我們的服務器中)。因此,客戶端是用Delphi編寫的,服務器是一個也在Delphi中編寫的http IOCP服務器(來自mORMot框架),對於我們使用嵌入Firebird 。Firedac多個連接池
我們的客戶(比方說200)可以擁有25-30個Firebird數據庫(共5000-6000個數據庫),每個用戶可以有4-5個用戶訪問。這不是一次全部發生。一個用戶可以在一個數據庫中工作,另外兩個用戶可以在另一個數據庫中工作,但所有數據庫都應該可用並聯機。所以,我可以有800-1000用戶在700-900 DBS的工作。數據庫並不大,一般爲20-30 MB,但可以達到200 MB。
這不是數據分片,所以請不要建議將所有數據庫合併在一起,我真的需要它們單獨備份/恢復/替換它們中的每一個。
所以,我需要多個連接池 - 對於每個數據庫,我需要一個連接池。我讀了關於Firedac連接池。 TFDManager似乎對我來說應該是完美的。我使用「Pooled = true」定義了多個「ConnectionDef」,它可以維護多個連接池(每個連接持續到不活動幾分鐘)。
問題:
我有服務器開始服務請求之前創建的所有 「ConnectionDef」 S?
TFDManager可以「處理」請求(並在不活動時超時連接),而在其他線程中,我需要創建一個新的數據庫,所以我需要創建一個新的連接池並開始從新服務請求創建數據庫。實際上,我可以在其他池正在使用時調用FDManager.AddConnectionDef(..)嗎?
同意不同意 - 連接池用於在通常創建/建立新資源時需要時間和/或資源時方便獲取資源。即使將本地數據庫文件附加到fbembed.dll等進程中,也需要一些時間和資源 - 將檢查SQL權限,每個附件都會分配單獨的緩衝區,即使它是相同的進程和相同的數據庫文件(> = FB 2.5)。所以,連接池在這裏適用。 – emk
定義「連接」並用關鍵部分保護它們不是連接池?那麼,爲什麼在有可用的測試車輪時發明車輪。即使您的方案看起來很簡單,因爲它只是每個數據庫的一個「連接」,我認爲我至少需要其中的兩個,因爲有時一個客戶端可以獲得較長時間的連接,因爲必須同步更大的更改日誌,因爲它是上次在線。無論如何,你的解決方案是好的,因爲它每個分區有一個關鍵部分,而Firedac每個數據庫都有一個關鍵部分。 – emk