在多線程應用程序中,一個好的做法是隔離訪問數據庫的組成部分,違反這種做法會在其他錯誤中產生訪問違規錯誤。為了幫助解決此問題,Bermarchadero提供了組件FDManager ,該組件負責連接的定義和管理,並且是線程安全的(在多線程環境中安全使用)。
資料來源: https://docwiki.embarcadero.com/radstudio/sydney/en/multithreading_(fiedac)
fdmanager使用的優點
庫定義客戶訪問數據庫。 [選修的]
與數據庫的連接設置集中化。
TFDConnection組件的參數化集中化。 (此配置擴展到應用程序中使用的所有FDConnection)
除了使用FDManger良好的實踐以及優化數據庫連接的技術(稱為連接池) 。
當我們需要在數據庫上執行任何操作時,首先有必要建立與它的連接時,該連接的建立通常是通過TCP/IP協議進行的,涉及打開和關閉連接的成本。在您可以有數千個恆定請求的流動的Web應用程序中,此費用尤其重要,並且每個請求都會生成數據庫連接的開放和關閉。避免這種連接的恆定“他媽的”的簡單技術是保持一定數量的連接(連接池),並在必要時重複使用,因此您可以減少機器的資源所花費和應用程序響應時間。
建立數據庫連接的成本可以在下面的圖像中使用Wireshark工具看到,我們可以看到用於執行簡單選擇的數據包的數量。
我們可以在下面的圖像中看到使用連接池數據庫查詢的行為:
要配置連接池,我們將使用fdmanager和池屬性。
| 範圍 | 描述 | 例子 |
|---|---|---|
| 合併 | 激活fdmanager.connectationndefs中通知的ConnectionDefname的連接池。 要使用連接池,連接定義必須是持久的或私人的。 | 真的 |
| pool_cleanuptimeout | 直到FireDac刪除直到pool_expireTimeOut時間才使用的連接之前,該時間為毫秒。 默認值為30000毫秒(30秒)。 | 15000毫秒 15 s |
| pool__expiretimeout | 在毫秒內,可以將無活動連接排除在池中並摧毀。 默認值為90000 ms(90秒)。 | 60000毫秒 60 s |
| pool_maximumemtes | 池中最大的連接數。 當應用程序需要更多連接時,會生成異常。默認值為50。 當達到此屬性上指定的連接總數時,會生成一個例外: | 100 |
通常, FDManager在以下情況下保持“物理”連接的庫。
要將FDManager與其他數據庫一起使用,請檢查鏈接:數據庫連接(FIREDAC)#Driver鏈接
| 資料庫 | 驅動程序 | TFDConneneOndeFpass | 單位 |
|---|---|---|---|
| Microsoft SQL Server | MSSQL | tfdphysssssqlonneonefpass | firedac.phys.mssqldef,firedac.stan.intf,firedac.phys,firedac.phys.odbcbase,firedac.phys.phys.msssql |
| Oracle服務器 | 現在 | tfdphysoracleconnecontefpass | firedac.phys.oracledef,firedac.stan.intf,firedac.phys,firedac.phys.phys.oracle |
| Postgresql | pg | tfdphyspgconneonecendefpass | fiedac.phys.pgdef,firedac.stan.intf,firedac.phys,firedac.phys.pg; |
| mysql Server | mysql | TFDPHYSMYSQLCONNEONEFPASS | firedac.phys.mysqldef,firedac.stan.intf,firedac.phys,firedac.phys.mysql |
| IBM DB2服務器) | DB2 | tfdphysdb2connection和efparams | firedac.phys.db2def,firedac.stan.intf,firedac.phys,firedac.phys.odbcbase,firedac.phys.db2 |
| 火鳥 | fb | tfdphysfbconneontefpass | firedac.phys.fbdef,firedac.stan.intf,firedac.phys,firedac.phys.ibbase,firedac.phys.fb |
| 互相 | IB | tfdphysibConneoneNeCendeFpass | firedac.phys.ibdef,firedac.stan.intf,firedac.phys,firedac.phys.ibbase,firedac.phys.ib |
| sqlite | sqlite | tfdphyssqliteconnection andefparams | fiedac.stan.expruncs,firedac.phys.sqlitedef,firedac.stan.intf,firedac.phys,firedac.phys.phys.sqlite |
| mongodb | 蒙哥 | tfdphysmongoconneottondefpass | firedac.phys.mongodbdef,firedac.stan.intf,firedac.phys,firedac.phys.mongodb |
| ODBC | ODBC | tfdphysodbcconneonecendefpass | firedac.phys.odbcdef,firedac.stan.intf,firedac.phys,firedac.phys.odbcbase,firedac.phys.odbc |
在項目上附加了兩個在多線程環境中使用數據庫連接的示例。
第一個示例,在桌面多線程環境中使用連接。
第二個示例,使用馬Web服務器中的多線程環境中使用連接。
兩個示例都使用火鳥數據庫