在多线程应用程序中,一个好的做法是隔离访问数据库的组成部分,违反这种做法会在其他错误中产生访问违规错误。为了帮助解决此问题,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服务器中的多线程环境中使用连接。
两个示例都使用火鸟数据库