• ADOConnection数据库连接池


    unit AdoconnectPool;

    interface

    uses
      Classes, Windows, SysUtils, ADODB, IniFiles, forms;

    type
      TADOConnectionPool = class(TObject)
      private
        FObjList:TThreadList;
        FTimeout: Integer;
        FMaxCount: Integer;
        FSemaphore: Cardinal;
        function CreateNewInstance(List:TList): TADOConnection;
        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: TADOConnection;
        procedure Unlock(var Value: TADOConnection);
      end;

    var
      ConnPool: TADOConnectionPool;
      g_ini: TIniFile;

    implementation

    constructor TADOConnectionPool.Create(ACapicity:Integer=30);
    begin
      FObjList:=TThreadList.Create;
      FTimeout := 3000;              // 3 second
      FMaxCount := ACapicity;
      FSemaphore := CreateSemaphore(nil, FMaxCount, FMaxCount, nil);
    end;

    function TADOConnectionPool.CreateNewInstance(List:TList): TADOConnection;
    var
      p: TADOConnection;
     
      function GetConnStr: string;
      begin
        try
          Result := g_ini.ReadString('ado','connstr','');
        except
          Exit;
        end;
      end;
    begin
      try
        p := TADOConnection.Create(nil);
        p.ConnectionString := GetConnStr;
        p.LoginPrompt := False;
        p.Connected:=True;
        p.Tag := 1;
        List.Add(p);
        Result := p;
      except
        on E: Exception do
        begin
          Result := nil;
          Exit;
        end;
      end;
    end;

    destructor TADOConnectionPool.Destroy;
    var
      i: Integer;
      List:TList;
    begin
      List:=FObjList.LockList;
      try
        for i := List.Count - 1 downto 0 do
        begin
          TADOConnection(List[i]).Free;
        end;
      finally
        FObjList.UnlockList;
      end;
      FObjList.Free;
      FObjList := nil;
      CloseHandle(FSemaphore);
      inherited;
    end;

    function TADOConnectionPool.GetLock(List:TList;Index: Integer): Boolean;
    begin
      try
        Result := TADOConnection(List[Index]).Tag = 0;
        if Result then
          TADOConnection(List[Index]).Tag := 1;
      except
        Result :=False;
        Exit;
      end;
    end;

    function TADOConnectionPool.Lock: TADOConnection;
    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 := TADOConnection(List[i]);
              PostMessage(Application.MainForm.Handle,8888,13,0);
              Exit;
            end;
          end;
          if List.Count < MaxCount then
          begin
            Result := CreateNewInstance(List);
            PostMessage(Application.MainForm.Handle,8888,11,0);
          end;
        finally
          FObjList.UnlockList;
        end;
      except
        Result := nil;
        Exit;
      end;
    end;

    procedure TADOConnectionPool.Unlock(var Value: TADOConnection);
    var
      List:TList;
    begin
      try
        List:=FObjList.LockList;
        try
          TADOConnection(List[List.IndexOf(Value)]).Tag :=0;
          ReleaseSemaphore(FSemaphore, 1, nil);
        finally
          FObjList.UnlockList;
        end;
        PostMessage(Application.MainForm.Handle, 8888, 12, 0);
      except
        Exit;
      end;
    end;

    initialization
      ConnPool := TADOConnectionPool.Create();
      g_ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'server.ini');
    finalization
      FreeAndNil(ConnPool);
      FreeAndNil(g_ini);

    end.

  • 相关阅读:
    空气墙的制作,标签的添加
    子弹朝向问题的解决,移动方法的编写
    子弹的朝向问题
    坦克的攻击方法
    移动优先级的添加,2D渲染层级问题
    碰撞器的添加,解决抖动问题
    控制图片的移动切换
    控制玩家的移动
    游戏中预制体的制作,2D动画的制作
    场景搭建,素材的处理
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2319952.html
Copyright © 2020-2023  润新知