DELPHI 创建数据池

该博客介绍了如何在Delphi中创建一个数据连接池,包括维护一个容器来存储数据连接,根据需要创建或复用数据源,以及一些实现细节。示例代码展示了创建和获取池中对象的基本操作。

众所众知  JAVA的数据池非常流行   

那么如何用DELPHI实现呢  ,这里提供个大概思路 

一 首先要有一个容器 能保存数据连接  

二 当调用的数据源不再当前容器  ,需要重新创建 ,存在则调出

三 其它的细节 例如最大个数 等细节就不在这里实现了  

样例代码如下 :

unit Utils.Pools;

interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
  FMX.Controls, FMX.Forms, System.Contnrs;
type
  TControlClass = class of TControl;

  TPoolsTool = class(TPersistent)
  private
    FList : TComponentList;
    function newPoolObject(TControlName:string):TControl;    //创建新资源
    function getPoolObject(TControlName:string):TControl;    //获取池中资源
  public
    constructor Create(); virtual;
    destructor  Destroy ;override;
    procedure clearPoolList;
    function MaperPoolObject(TControlName:string):Boolean;
  end;

var PoolsTool: TPoolsTool;

implementation

{ TPoolsTool }

procedure TPoolsTool.clearPoolList;
var
  index: Integer;
  ctl: TControl;
begin
  for index := 0 to FList.Count-1 do
  begin
    ctl := TControl(FList[index]);
    if Assigned(ctl) then
    begin
      FreeAndNil(ctl);
    end;
  end;
end;

constructor TPoolsTool.Create;
begin
  FList :=TComponentList.Create;
end;

destructor TPoolsTool.Destroy;
begin
  clearPoolList;
  FList.Free;
  inherited;
end;

function TPoolsTool.getPoolObject(TControlName: string): TControl;
var
  index: Integer;
  ctl: TControl;
begin
  //建议加锁
  Result :=  nil;
  try
    for index := 0 to FList.Count-1 do
    begin
      ctl := TControl(FList[index]);
      if UpperCase(ctl.ClassName)=UpperCase(TControlName) then
      begin
        Result :=  ctl;
        exit;
      end;
    end;
  finally

  end;

end;


function TPoolsTool.newPoolObject(TControlName: string): TControl;
var
  aClass: TControlClass;
begin
  Result := nil;
  try
    //建议加锁
    aClass := TControlClass(GetClass(TControlName));
    if Assigned(aClass) then
    begin
      Result := aClass.Create(Application);
      aClass.ClassName := TControlName;
      FList.Add(aClass)
    end;
  finally

  end;
end;


function TPoolsTool.MaperPoolObject(TControlName: string): Boolean;
var
  ctl: TControl;
begin
  ctl := getPoolObject(TControlName);
  if ctl=nil then
     ctl := newPoolObject(TControlName);
  Result := ctl;
end;
initialization
  PoolsTool:= TPoolsTool.Create;
finalization
  FreeAndNil(PoolsTool);

end.

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值