当前位置: 首页 > news >正文

TADOQuery池

//==============================================================================
// TADOQuery池    咏南工作室        2008-10-06 14:22:35
//==============================================================================

unit UAdoQueryPool;

interface

uses
  SysUtils, Classes, DB, ADODB, Contnrs, Windows, ExtCtrls;

type
  RQueryParams=record
    QueryMin:Integer;   //池中对象最小数  10
    QueryMax:Integer;   //池中对象最大数  100
    TimerTime:Integer;  //清理程序启动的时间间隔 600000(10分钟)
  end;

type
  TAdoQueryPool = class(TComponent) //AdoQuery缓冲池类
  private
    fAdoQueryMin : Integer;
    fAdoQueryMax : Integer;
    fAdoQueryList : TComponentList;
    fCleanTimer : TTimer;
    fQueryParams:RQueryParams;
    procedure fCleanOnTime(sender : TObject); //按时整理缓冲池
    function fCreateADOQuery : TADOQuery;     //创建新的AdoQuery
    procedure fClean;                         //整理 (清理长时间不用的和长时间不归还的AdoQuery)
    { Private declarations }
  public
    { Public declarations }
    constructor Create(owner : TComponent;QueryParams:RQueryParams);
    function getAdoQuery : TADOQuery;             //取得空闲TADOQuery
    procedure returnAdoQuery(qry : TADOQuery);    //归还
end;


implementation

{ TAdoQueryPool }

constructor TAdoQueryPool.Create(owner: TComponent;QueryParams:RQueryParams);
var
  index : Integer;
  aAdoQuery : TADOQuery;
begin
  fQueryParams:=QueryParams;

  fAdoQueryMin := fQueryParams.QueryMin;
  fAdoQueryMax := fQueryParams.QueryMax;
  fAdoQueryList := TComponentList.Create(False);
  for index := 1 to fAdoQueryMin do
    fAdoQueryList.Add(fCreateADOQuery);

  if fCleanTimer = nil then
  begin
    fCleanTimer := TTimer.Create(Self);
    fCleanTimer.Name := 'MyCleanTimer1';
    fCleanTimer.Interval :=fQueryParams.TimerTime; //清理程序启动的时间间隔(10分钟)
    fCleanTimer.OnTimer := fCleanOnTime;
    fCleanTimer.Enabled := True;
  end;
end;

procedure TAdoQueryPool.fClean;
var
  iNow : Integer;   //当前时刻
  iCount : Integer; //List大小
  index : Integer;
begin
  iNow := GetTickCount;
  iCount := fAdoQueryList.Count;
  for index := iCount - 1 downto 0 do
  begin
    if TADOQuery(fAdoQueryList[index]).Tag > 0 then //若空闲
    begin
      if fAdoQueryList.Count > fAdoQueryMin then //若AdoQuery个数大于最小值
      begin
        TADOQuery(fAdoQueryList[index]).Free;
      end
      else if TAdoQuery(fAdoQueryList[index]).Tag < 0 then
      begin
        if iNow + TADOQuery(fAdoQueryList[index]).Tag > 10800000 then //被连续使用超过3小时的AdoQuery(很可能是死的),释放
        begin
          TADOQuery(fAdoQueryList[index]).Free;
          if fAdoQueryList.Count < fAdoQueryMin then//若小于缓冲池最小数目,则创建新的空闲AdoQuery
            fAdoQueryList.Add(fCreateADOQuery);
        end;
      end;
    end;
  end;
end;

procedure TAdoQueryPool.fCleanOnTime(sender: TObject);
begin
  fClean;
end;

function TAdoQueryPool.fCreateADOQuery: TADOQuery;
begin
  Result := TADOQuery.Create(Self);
  Result.Tag := GetTickCount; //空闲,开始计时(正数表示空闲)
end;

function TAdoQueryPool.getAdoQuery: TADOQuery;
var
  index : Integer;
begin
  Result := nil;
  for index := 0 to fAdoQueryList.Count - 1 do
  begin
    if TADOQuery(fAdoQueryList[index]).Tag > 0 then
    begin
      Result := TADOQuery(fAdoQueryList[index]);
      Result.Tag := - GetTickCount;  //使用开始计时 (负数表示正在使用)
    end;
  end;

  if (Result = nil) and (index < fAdoQueryMax) then//无空闲AdoQuery,而缓冲池数目小于允许最大数目(fAdoQueryMax),创建新的Adoquery
  begin
    Result := fCreateADOQuery;
    Result.Tag := - GetTickCount;    //使用,开始计时 (负数表示正在使用)
    fAdoQueryList.Add(Result);
  end;
end;

procedure TAdoQueryPool.returnAdoQuery(qry: TADOQuery);
begin
  if fAdoQueryList.IndexOf(qry) > -1 then
    qry.Tag := GetTickCount; //开始空闲计时
end;

end.

相关文章:

  • Windows7问题集
  • 连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑
  • 应用开发框架之——业务规则脚本化
  • 对等计算实践: P2P 遇上 SSL
  • Sprout and the Bean
  • 数据库水平拆分和垂直拆分区别(以mysql为例)
  • 跟我一起学WCF(11)——WCF中队列服务详解
  • 第6期(江西省吉安市永丰县)县长手机信箱工作简报(自吹自擂政绩,自圆其说)
  • 各种排序算法的稳定性和时间复杂度小结
  • Java 种15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁等等...
  • 前端设计模式(0)面向对象设计原则
  • 专访Connolly:为什么我们需要手动回归测试宣言?
  • jedis连接服务超时connect timed out
  • 可以用parseInt()向下取整和Math.floor()有一样的功能
  • node和express搭建代理服务器(源码)
  • 分享的文章《人生如棋》
  • “大数据应用场景”之隔壁老王(连载四)
  • 【翻译】babel对TC39装饰器草案的实现
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 4. 路由到控制器 - Laravel从零开始教程
  • angular2开源库收集
  • Hibernate最全面试题
  • HTML中设置input等文本框为不可操作
  • HTTP那些事
  • MySQL主从复制读写分离及奇怪的问题
  • node 版本过低
  • python docx文档转html页面
  • Theano - 导数
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 闭包--闭包作用之保存(一)
  • 编写符合Python风格的对象
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 驱动程序原理
  • 微信小程序填坑清单
  • 学习笔记:对象,原型和继承(1)
  • 一个SAP顾问在美国的这些年
  • 用Python写一份独特的元宵节祝福
  • 最近的计划
  • 2017年360最后一道编程题
  • 移动端高清、多屏适配方案
  • #大学#套接字
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (十八)三元表达式和列表解析
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ./和../以及/和~之间的区别
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .gitignore文件设置了忽略但不生效