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
 
posted @ 2020-05-08 09:56  _成飞  阅读(934)  评论(0编辑  收藏  举报