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
.
私有的:
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;
或者
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的连接状态保持为连接!!!)。
要关闭和摧毁物理连接,用:
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