FireDAC连接池的使用

以前一直习惯用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就是取了一个池中的连接。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值