FireDac Pooling
2024-08-26 14:17:58
1.建立FDManager的ConnectionDef。并设置此Pooling为True.
2.建立Thread类进行多个FDConnection连接DB。
3.本列是oracle远程数据.如下图:
Open pooling是建立FDManger中的Connection. Thread按钮是建立连接的测试。右边的空白是显示连接时间(为Ticks)
时间单位换算:
1秒=1000毫秒
1毫秒=1000微秒
1微秒=1000纳秒
1纳秒=1000皮秒
1皮秒=1000飞秒
在C#中,1Ticks = 100纳秒
以下为代码:
unit Unit1; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
FireDAC.Phys, Vcl.Buttons, FireDAC.Comp.Client, FireDAC.Stan.Pool,
FireDAC.Stan.Async, FireDAC.VCLUI.Wait, Data.DB, Vcl.StdCtrls,
FireDAC.Moni.Base, FireDAC.Moni.RemoteClient,FireDAC.DApt,
FireDAC.Phys.OracleDef, FireDAC.Phys.Oracle,System.Diagnostics; type TForm1 = class(TForm)
FDManager1: TFDManager;
SpeedButton1: TSpeedButton;
FDConnection1: TFDConnection;
BitBtn1: TBitBtn;
Memo1: TMemo;
FDMoniRemoteClientLink1: TFDMoniRemoteClientLink;
FDPhysOracleDriverLink1: TFDPhysOracleDriverLink;
procedure BitBtn1Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; TDBThread=class(TThread)
private
FForm:TForm1;
FConn:TFDConnection;
FQry :TFDQuery;
procedure exePrc;
public
procedure Execute;override;
constructor Create(AForm:TForm1);
destructor Destroy;override;
end;
var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.BitBtn1Click(Sender: TObject);
var
i:integer;
ATrhed:TDBThread;
AStopWatch:TStopwatch;
j:Int64; begin
for i := to do //如果产生的Connection大于连接池的数量则会报错提示
begin
ATrhed:= TDBThread.Create(self);
end;
FDConnection1.ConnectionDefName :='oracle' ;
FDConnection1.LoginPrompt := false; //以下为不用连接池,时间就比较长
AStopWatch := TStopwatch.StartNew;
FDConnection1.Connected := true;
AStopWatch.Stop;
i:=AStopWatch.ElapsedTicks;
self.Memo1.Lines.Add('not pooling: '+j.ToString()+' Ticks'); end; procedure TForm1.SpeedButton1Click(Sender: TObject);
var
conn: IFDStanConnectionDef;
begin
FDManager1.Close;
conn:= self.FDManager1.ConnectionDefs.AddConnectionDef;
conn.Name :='ora_test';
conn.Params.DriverID :='Ora';
conn.Params.UserName :='admin';
conn.Params.Password :='pwd';
conn.Params.Database := 'testdb';
conn.Params.Pooled := True; //启用pool
conn.Params.PoolMaximumItems := ; //10.2.3中默认的最大池为50.一般够用
conn.Apply;//此方法可以不用
FDManager1.Open;//产生池
end; { TDBThread } constructor TDBThread.Create(AForm: TForm1);
begin
FreeOnTerminate := True;
FForm := AForm;
FConn := TFDConnection.Create(nil);
FQry := TFDQuery.Create(nil);
FQry.Connection := FConn;
FConn.ConnectionDefName := AForm.FDManager1.ConnectionDefs.ConnectionDefByName('ora_test').Name;//自动调用池,相当于FDmanager.AcquireConnection方法。最好按此列调用
inherited Create(false);; end; destructor TDBThread.Destroy;
begin
FConn.Free;
FQry.Free;
inherited;
end; procedure TDBThread.Execute;
begin
FQry.Close;
FQry.Open('select sysdate from dual');
Synchronize(exePrc);
end; procedure TDBThread.exePrc;
var
AStopWatch:TStopwatch;
i:Int64;
begin
AStopWatch := TStopwatch.StartNew;
FConn.Connected := True;
AStopWatch.Stop;
i:=AStopWatch.ElapsedTicks;
FForm.Memo1.Lines.Add('pooling: '+i.ToString()+' Ticks');
end; end.
运行结果:
最新文章
- Web APi之异常处理(Exception)以及日志记录(NLog)(十六)
- 查看struct或class的内存布局
- 2 Egg Problem
- 扩大Tomcat内存
- eclipse svn异常:RA layer request failed 的解决方案
- lookup:ID列
- 01_JavaMail_02_Base64加密
- WordPress /wp-admin/users.php畸形s参数路径泄漏漏洞
- js原生封装自定义滚动条
- [转] UIImage 图像-IOS开发 (实例)
- python运维开发之第十一天(RabbitMQ,redis)
- android小知识之自定义通知(toast)
- Android一些解决方案内存问题(一)
- java基础练习 8
- PHP那些最好的轮子
- Jenkins+Git 持续集成
- 房上的猫:HTML5基础
- Linux知识积累(3)$()和${}和$(())和(())
- MyCat读写分离-笔记(四)
- 【原创】大数据基础之Ambari(4)通过Ambari部署Impala
热门文章
- webkit开发,app移动前端知识点
- mysql 存在update不存在insert
- xmlns:sys=";clr-namespace:System;assembly=mscorlib"; NOTE: System;与assembly中间不能有空格
- 通过js修改微信内置浏览器title
- java+ssh+eclipse开发过程问题记录
- Spring Framework框架解析(1)- 从图书馆示例来看xml文件的加载过程
- PowerDesigner使用教程(转)
- Lesson 2
- css做中划线与文字排版
- [BZOJ1031][JSOI2007]字符加密Cipher 解题报告