zoukankan      html  css  js  c++  java
  • SqlQuery池

    unit SqlQueryPool;
    interface
    uses
      Classes, Windows, SysUtils, forms, DB, SqlExpr, FMTBcd;
    type
      TSQLQueryPool = class(TObject)
      private
        FObjList:TThreadList;
        FTimeout: Integer;
        FMaxCount: Integer;
        FSemaphore: Cardinal;
        function CreateNewInstance(List:TList): TSQLQuery;
        function GetLock(List:TList;Index: Integer): Boolean;
      public
        property Timeout:Integer read FTimeout write FTimeout;
        property MaxCount:Integer read FMaxCount;
        constructor Create(ACapicity:Integer=30);overload;
        destructor Destroy;override;
        function Lock: TSQLQuery;
        procedure UnLock(var Value: TSQLQuery);
      end;
    var
      DBXQryPool: TSQLQueryPool;
    implementation
    constructor TSQLQueryPool.Create(ACapicity:Integer=30);
    begin
      FObjList:=TThreadList.Create;
      FTimeout := 3000;
      FMaxCount := ACapicity;
      FSemaphore := CreateSemaphore(nil, FMaxCount, FMaxCount, nil);   
    end;
    function TSQLQueryPool.CreateNewInstance(List:TList): TSQLQuery;
    var
      p: TSQLQuery;
    begin
      try
        p := TSQLQuery.Create(nil);
        p.Tag := 1;
        List.Add(p);
        Result := p;
      except
        Result := nil;
        Exit;
      end;
    end;
    destructor TSQLQueryPool.Destroy;
    var
      i: Integer;
      List:TList;
    begin
      List:=FObjList.LockList;
      try
        for i := List.Count - 1 downto 0 do
        begin
          TSQLQuery(List[i]).Free;
        end;
      finally
        FObjList.UnlockList;
      end;
      FObjList.Free;
      FObjList := nil;
      CloseHandle(FSemaphore);
      inherited Destroy;
    end;
    function TSQLQueryPool.GetLock(List:TList;Index: Integer): Boolean;
    begin
      try
        Result := TSQLQuery(List[Index]).Tag = 0;
        if Result then
          TSQLQuery(List[Index]).Tag := 1;
      except
        Result :=False;
        Exit;
      end;
    end;
    function TSQLQueryPool.Lock: TSQLQuery;
    var
      i: Integer;
      List:TList;
    begin
      try
        Result := nil;
        if WaitForSingleObject(FSemaphore, Timeout) = WAIT_FAILED then Exit;
        List:=FObjList.LockList;
        try
          for i := 0 to List.Count - 1 do
          begin
            if GetLock(List,i) then
            begin
              Result := TSQLQuery(List[i]);
           //   PostMessage(Application.MainForm.Handle, 8888,23,0);
              Exit;
            end;
          end;
          if List.Count < MaxCount then
          begin
            Result := CreateNewInstance(List);
          //  PostMessage(Application.MainForm.Handle, 8888,21,0);
          end;
        finally
          FObjList.UnlockList;
        end;
      except
        Result :=nil;
        Exit;
      end;
    end;
    procedure TSQLQueryPool.Unlock(var Value: TSQLQuery);
    var
      List:TList;
    begin
      try
        List:=FObjList.LockList;
        try
          TSQLQuery(List[List.IndexOf(Value)]).Tag :=0;
          ReleaseSemaphore(FSemaphore, 1, nil);
        finally
          FObjList.UnlockList;
        end;
      //  PostMessage(Application.MainForm.Handle, 8888, 22, 0);
      except
        Exit;
      end;
    end;
    initialization
      DBXQryPool := TSQLQueryPool.Create();
    finalization
      FreeAndNil(DBXQryPool);
    end.

  • 相关阅读:
    flume 安装过程记录
    hive 动态分区插入
    hive 数据导入
    scala 学习笔记
    hive 日志
    Linux下设置和查看环境变量
    数据结构(4):图解递归调用机制
    使用数据结构栈实现表达式计算器
    数据结构(3):java使用数组模拟堆栈
    使用Vue和Element-ui的cdn模式临摹一个后台框架
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2347139.html
Copyright © 2011-2022 走看看