FireDAC的连接池
FireDAC的连接池和一般理解的连接池有些区别。FireDAC的架构是分层设计的,平常我们用的都是高层的应用层。比如TFDConnection,具体连接什么,还要物理层的支持,就是那些TFDPhysXXXLink这些控件。所以只要一个FDConnection控件,就可以直接支持池,只要设置了池连接参数,开启池功能,就可以直接使用。(不是平常理解的建立一个FDConnection列表,然后外部管理这个列表来实现池,原来的TSQLConnection也是这样的,内部直接支持池。)。同时,用TFDManager来管理物理连接参数列表(TFDManager可以建立持久的(有唯一名字、保存在ini文件的),私有的(有唯一名字、只存在TFDManager中,不保存到ini文件),临时的(无名字,也不要TFDManager管理,直接在FDConnection控件设置,比如我们在设计界面打开FDConnection控件的连接设置界面,且不从以定义的列表选择连接名,而是直接设置各个连接参数,也就是直接保存在FDConnection.Params中)),只有持久的,私有的可以建立连接池,并且可以共享给其它代码使用(具体见帮助文档)。
FireDAC supports 3 connection definition kinds:
这3种连接的建立DEMO,帮助文档也有示例。
用FDManager保存的持久或私有连接参数,可以这样
持久的(ini文件):
[DataSnapCONNECTION]
DriverName=DataSnap
HostName=localhost
port=211
[MSSQLConnection]
SchemaOverride=sa.dbo
DriverName=MSSQL
HostName=ServerName
DataBase=Database Name
User_Name=user
Password=password
BlobSize=-1
ErrorResourceFile=
LocaleCode=0000
IsolationLevel=ReadCommitted
OS Authentication=False
Prepare SQL=False
ConnectTimeout=60
Mars_Connection=False
[MySQLConnection]
DriverName=MySQL
HostName=ServerName
Database=DBNAME
User_Name=user
Password=password
ServerCharSet=
BlobSize=-1
ErrorResourceFile=
LocaleCode=0000
Compressed=False
Encrypted=False
ConnectTimeout=60
[OracleConnection]
DriverName=Oracle
DataBase=Database Name
User_Name=user
Password=password
RowsetSize=20
BlobSize=-1
ErrorResourceFile=
LocaleCode=0000
IsolationLevel=ReadCommitted
OS Authentication=False
Multiple Transaction=False
Trim Char=False
Decimal Separator=.
[SQLITECONNECTION]
DriverName=Sqlite
Database=test.db
以上摘录自delphi自带的dbxconnections.ini文件,一般保存在路径:C:\Users\Public\Documents\Embarcadero\Studio\FireDAC\FDConnectionDefs.ini
.
私有的:
1 2 3 4 5 6 7 8 9 10 11 12 | var oParams: TStrings; begin oParams := TStringList . Create; oParams . Add( 'Database=ORA_920_APP' ); oParams . Add( 'User_Name=ADDemo' ); oParams . Add( 'Password=a' ); oParams . Add( 'Pooled=True' ); FDManager . AddConnectionDef( 'Oracle_Pooled' , 'Ora' , oParams); ..................... FDConnection1 . ConnectionDefName := 'Oracle_Pooled' ; FDConnection1 . Connected := True ; |
或者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | with FDManager . ConnectionDefs . AddConnectionDef do begin Name := 'MSSQL_Connection' ; Params . Values[ 'DriverID' ] := 'MSSQL' ; Params . Values[ 'Server' ] := '(Local)' ; Params . Values[ 'Database' ] := 'Northwind' ; Params . Values[ 'OSAuthent' ] := 'No' ; Params . Values[ 'User_Name' ] := 'sa' ; Params . Values[ 'Password' ] := '123' ; Params . PoolMaximumItems := 50 ; //系统默认50 Params . Pooled := True ; //这个是关键 end ; .......... FDConnection . ConnectionDefName := 'MSSQL_Connection' ; FDConnection . Connected := True ; |
当FDConnection.Connected := True;时,就会从连接池里获得一个物理连接,设置为False,物理连接就释放回连接池(注意释放回池里的FDConnection的连接状态保持为连接!!!)。
要关闭和摧毁物理连接,用:
1 2 3 | FDManager . CloseConnectionDef( 'MSSQL_Connection' ); 或者全部: FDManager . Close; |
其它的一些时间参数设置(摘自帮助文档):

在一般单线程运用中,用一个TFDConnection来建立连接,只要打开池并且设置了FDManager连接参数,就可以了。
在多程序运用中,每个线程还是要创建一个TFDConnection,然后各个线程可以共享FDManager,因为FDManager是单实例的。(我是这么理解的,多线程中,FDConnection不是池化的,但是物理连接是池化的)。
DELPHI有2个Sample:
C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Database\FireDAC\Samples\Comp Layer\TFDConnection\Pooling
C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Database\FireDAC\Samples\Phys Layer\IFDPhysConnection\Pooling
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!