マルチスレッドアプリケーションでは、データベースへのアクセスのコンポーネントを分離することができます。このプラクティスの違反は、他のエラーの中でアクセス違反エラーを生成する可能性があります。この問題を解決するために、Albarchaderoは、接続の定義と管理を担当し、スレッドセーフ(マルチスレッド環境での安全な使用)を担当するコンポーネントFDManagerを利用可能にしました。
出典: https://docwiki.embarcadero.com/radstudio/sydney/en/multithreading_(fiedac)
FDManager使用の利点
ライブラリ定義データベースへの顧客アクセス。 [オプション]
データベースとの接続設定の集中化。
TFDConnectionコンポーネントのパラメータ化の集中化。 (この構成は、アプリケーションで使用されるすべてのFDConnectionに拡張されます)
FDMangerを使用することに加えて、コネクションプールと呼ばれるデータベース接続を最適化する手法の使用と使用。
データベースで操作を実行する必要がある場合、最初に接続を確立する必要があります。通常、この接続の確立は、接続の開閉コストを伴うTCP/IPプロトコルを介して発生します。このコストは、数千の一定の要求のフローを持つことができるWebアプリケーションで特に重要であり、それぞれがデータベース接続の開閉を生成します。接続のこの絶え間ない「クソ」を回避するための簡単な手法は、一定の数の接続を常に開いて(接続プール)維持し、必要に応じて再利用することです。そのため、マシンのリソースの使用とアプリケーションの応答時間の両方を減らします。
データベース接続を確立するためのこのコストは、 Wiresharkツールを使用して下の画像に表示されます。単純な選択の実行に使用されるパケットの量を確認できます。
接続プールを使用して、データベースクエリの動作の下の画像で確認できます。
接続プールを構成するには、 FDManagerとプールプロパティを使用します。
| パラメーター | 説明 | 例 |
|---|---|---|
| プール | fdmanager.connectationndefsに通知されたConnectionOndEfNameの接続プールをアクティブにします。 接続プールを使用するには、接続定義は永続的またはプライベートでなければなりません。 | 真実 |
| pool_cleanuptimeout | FireDacがPool_expireTimeOut時間まで使用されなかった接続を削除するまで、ミリ秒単位での時間。 デフォルト値は30000ミリ秒(30秒)です。 | 15000ミリ秒 15秒 |
| pool_expiretimeout | ミリ秒単位での時間、その後、非アクティブな接続をプールから除外して破壊することができます。 デフォルト値は90000ミリ秒(90秒)です。 | 60000ミリ秒 60秒 |
| pool_maximumemtes | プール内の接続の最大数。 アプリケーションがより多くの接続を必要とする場合、例外が生成されます。デフォルト値は50です。 このプロパティで指定された接続の総数に到達すると、例外が生成されます。 | 100 |
一般に、 FDManagerは次のときに「物理的な」接続のプールを開いたままにします
FDManagerを他のデータベースで使用するには、リンクを確認してください:データベース接続(FireDac)#Driverリンケージ
| データベース | driverid | tfdconneneondefpass | ユニット |
|---|---|---|---|
| Microsoft SQL Server | MSSQL | tfdphysmsssqlonneonefpass | firedac.phys.mssqldef、firedac.stan.intf、firedac.phys、firedac.phys.odbcbase、firedac.phys.mssql |
| Oracleサーバー | 今 | tfdphysoracleconnecontefpass | firedac.phys.oracledef、firedac.stan.intf、firedac.phys、firedac.phys.oracle |
| postgreSql | pg | tfdphyspgconneonecendefpass | fiedac.phys.pgdef、firedac.stan.intf、firedac.phys、firedac.phys.pg; |
| mysqlサーバー | mysql | tfdphysmysqlconneonefpass | firedac.phys.mysqldef、firedac.stan.intf、firedac.phys、firedac.phys.mysql |
| IBM DB2サーバー) | DB2 | tfdphysdb2connectionandefparams | firedac.phys.db2def、firedac.stan.intf、firedac.phys、firedac.phys.odbcbase、firedac.phys.db2 |
| Firebird | FB | tfdphysfbconneontefpass | firedac.phys.fbdef、firedac.stan.intf、firedac.phys、firedac.phys.ibbase、firedac.phys.fb |
| インターベース | IB | tfdphysibconneonecendefpass | firedac.phys.ibdef、firedac.stan.intf、firedac.phys、firedac.phys.ibbase、firedac.phys.ib |
| sqlite | sqlite | tfdphyssqliteconnectionandefparams | fiedac.stan.exprfuncs、firedac.phys.sqlitedef、firedac.stan.intf、firedac.phys、firedac.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 |
プロジェクトに添付されているのは、マルチスレッド環境でデータベース接続を使用する例が2つあります。
最初の例は、デスクトップ用のマルチスレッド環境で接続を使用しています。
2番目の例、馬を備えたWebサーバーのマルチスレッド環境で接続を使用します。
どちらの例もFirebirdデータベースを使用しています