要支持连接池,必须让FDManager连管理,也就是,必须:1,FDConnectionDefs.ini在定义一个连接,2,必须FDConnection的Params必须是空的。第二个条件比较容易理解,因为要是不同的FDConnection指定了不同的连接参数,那么连接池里面的连接属性肯定需要不一样才行。第一个条件就比较恶心了,莫非都得需要这个配置文件才可??岂不是App都要带一个这个FDConnectionDefs.ini??
仔细看了这里
发现可以定义FireDAC supports 3 connection definition kinds:的Private类型也可以只是Pool。
代码如下了
procedure TForm1.FormCreate(Sender: TObject); var oParams: TStrings; begin with FDManager do begin oParams := TStringList.Create; oParams.Add('Database=xxx.xxx.xxx.xxx:1521/orac'); oParams.Add('Pooled=True'); oParams.Add('DriverID=Ora'); oParams.Add('User_Name=username'); oParams.Add('Password=password'); oParams.Add('OSAuthent=No'); oParams.Add('POOL_MaximumItems=1'); //搞一个测试看看 FDManager.AddConnectionDef('Ora_Pooled', 'Ora', oParams); FreeAndNil(oParams); end; end;
这样就可以定义一个 Private的连接了
另外,看了文档,也明白了,连接定义FDConnectionDefs.ini的名字可以自己起,然后设置上 FDManager的ConnectionDefFileName就可以,这样还灵活一点点。
这个【Private】的意思,没看明白,因为就算【Persistent】也肯定是不能跨Exe来Pool的。
连接池的使用,直接定义一个conn,然后设置
procedure TForm1.Button1Click(Sender: TObject); var conn: TFDCustomConnection; begin conn := TFDCustomConnection.Create(nil); conn.ConnectionDefName := 'Ora_Pooled'; FDQuery1.Connection := conn; FDQuery1.Active := True; conn := TFDCustomConnection.Create(nil); conn.ConnectionDefName := 'Ora_Pooled'; FDQuery2.Connection := conn; FDQuery2.Active := True; end;
启动了pool后,conn的close也不是真的close,只是还给pool。 当超过
POOL_MaximumItems定义的值时,conn的发起连接时就会报异常了。
监视oracle会发现有两个连接连接上了。
另外连接池和
FDManager.AcquireConnection
FDManager.ReleaseConnection
FDManager.ReleaseConnection
一分钱关系都没有
没有评论:
发表评论