以前一直习惯用ADO,后来用FireDAC时也没怎么使用连接池,前段时间对FireDAC的连接池做了一些简单的学习,当时的学习重点放在了连接的配置参数方面。结果,今天因为解决一些问题才发现使用错误。
这也是之前学习不认真导致的错误,而且应该是一个低级错误。所以再次总结一下:
首先是,FireDAC的连接池必须使用TFDManager,由TFDManager来对池进行管理,使用ConnectionDef管理数据连接参数,其中主要使用INI配置文件或AddConnectionDef增加配置的方式。部分样例如下:
procedure TForm1.PersistentConnectionClick(Sender: TObject);
var
oDef: IFDStanConnectionDef;
oParams: TFDPhysMSSQLConnectionDefParams; // MSSQL connection params
begin
// Adding new persistent connection to fdconnectiondefs.ini
FDManager.ConnectionDefs.AddConnectionDef;
oDef := FDManager.ConnectionDefs.AddConnectionDef;
oDef.Name := cNameConnDef;
oParams := TFDPhysMSSQLConnectionDefParams(oDef.Params);
oParams.DriverID := 'MSSQL'
oParams.Database := 'Northwind';
oParams.UserName := '.............';
oParams.Password := '.............';
oParams.Server := '127.0.0.1';
oParams.OSAuthent := false;
oParams.MARS := false;
oDef.MarkPersistent;
oDef.Apply;
end;
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);
INI配置方式:先需要创建一个INI文件,比如Driver.ini, 文件内容如下:
[MSSQL_Pool]
DriverID=MSSQL
Pooled=True
Server=192.168.2.188
Database=yqsh_SmartTable
User_Name=sa
Password=123
POOL_CleanupTimeout=0
POOL_ExpireTimeout=0
POOL_MaximumItems=50
CharacterSet=UTF8
[MySQL_Pool]
DriverID=MySQL
Pooled=True
Database=ungsm
User_Name=root
Password=1234
POOL_CleanupTimeout=0
POOL_ExpireTimeout=0
POOL_MaximumItems=50
Server=192.168.2.188
UseSSL=True
CharacterSet=utf8
上面INI文件里,我们建立了两个连接和配置参数,分别是MSSQL_Pool, MySQL_Pool,TFDManager 设置属性ConnectionDefFileName为Driver.ini的全路径就可以了。
下面看一段官方的代码:
type
TDBThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TDBThread.Execute;
var
oConn: TFDConnection;
oPrc: TFDQuery;
begin
FreeOnTerminate := False;
oConn := TFDConnection.Create(nil);
oConn.ConnectionDefName := 'MSSQL_Pool'; // see next section
oPrc := TFDStoredProc.Create(nil);
oPrc.Connection := oConn;
try
oConn.Connected := True;
oPrc.StoredProcName := 'MY_LONG_RUNNING_PROC';
oPrc.ExecProc;
finally
oPrc.Free;
oConn.Free;
end;
end;
// main application code
var
oThread1, oThread2: TDBThread;
begin
FDManager.Active := True;
...
oThread1 := TDBThread.Create(False);
oThread2 := TDBThread.Create(False);
...
oThread1.WaitFor;
oThread1.Free;
oThread2.WaitFor;
oThread2.Free;
end;
之前我的错误就在于没有动态去创建TFDConnection,把重点放在了数据连接参数的配置方式去了,忽略了对文档中“FDConnection1.Connected:=True;”的理解。自然的认为Connected设置为true就是取了一个池中的连接。