2 Star 7 Fork 1

妖蛋 / EAS工作流挂起监控工具

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
unidacPool.pas 4.80 KB
一键复制 编辑 原始数据 按行查看 历史
妖蛋 提交于 2019-12-19 21:30 . 工程发布
unit unidacPool;
{
UniDac的小池一枚
注:本人比较懒,所以这个只完成了我用到的,用不到的就没搞 ^_^
用到了QDAC的QSimperPool,下载地址请百度~_~,感谢波哥
版权没有,仿冒不究
注意:pop如果池已满会阻塞当前线程,直至池可用
}
interface
uses
System.Classes,QSimplePool, Data.DB, DBAccess, Uni, UniProvider,
OracleUniProvider, MemDS,Winapi.Windows;
type
{ TItemUniOracle }
TItemUniOracle = class(TObject)
private
OracleUniProvider: TOracleUniProvider;
UniConnection: TUniConnection;
function ReadConnected:Boolean;
protected
public
UniQuery: TUniQuery;
UniDataSource: TUniDataSource;
UniMetaData: TUniMetaData;
property Connected:Boolean read ReadConnected;
procedure OnConnectionError(Sender: TObject; E: EDAError;var Fail: Boolean);
constructor Create(Sender: TComponent;Server:string;User:string;password:string;AutoConnect:Boolean = True);
procedure Connect;
destructor Destroy; override;
published
end;
{ TUniDacAnyPool }
TUniDacAnyPool = class(TObject)
private
Pool:TQSimplePool;
procedure AfterPop(ASender: TQSimplePool; AData: Pointer);
procedure BeforePush(ASender: TQSimplePool; AData: Pointer);
protected
public
function pop:TItemUniOracle;
function Count:Integer;
procedure push(ADate:TItemUniOracle);
constructor Create(AMaxSize:Integer);
destructor Destroy; override;
published
end;
const
Config_Server:string = '';
Config_UserName:string = '';
Config_PassWord:string = '';
procedure OnNew(ASender: TQSimplePool;var AData: Pointer);
procedure OnFree(ASender: TQSimplePool;AData: Pointer);
procedure OnReset(ASender: TQSimplePool;AData: Pointer);
implementation
{ TItemUniOracle }
procedure TItemUniOracle.Connect;
begin
UniConnection.Connect;
end;
constructor TItemUniOracle.Create(Sender: TComponent;Server:string;User:string;password:string;AutoConnect:Boolean = True);
begin
//UniDataSource
UniDataSource := TUniDataSource.Create(Sender);
//UniMetaData
UniMetaData := TUniMetaData.Create(Sender);
//OracleUniProvider
OracleUniProvider := TOracleUniProvider.Create(Sender);
//UniQuery
UniQuery := TUniQuery.Create(Sender);
//UniConnection
UniConnection := TUniConnection.Create(Sender);
//UniDataSource
UniDataSource.DataSet := UniMetaData;
//UniMetaData
UniMetaData.Connection := UniConnection;
//UniQuery
UniQuery.Connection := UniConnection;
UniQuery.MasterSource := UniDataSource;
//UniConnection
UniConnection.ProviderName := 'Oracle';
UniConnection.Username := User;
UniConnection.Password := password;
UniConnection.Server := Server;
UniConnection.SpecificOptions.Values['Charset'] := 'utf-8';
UniConnection.SpecificOptions.Values['Direct'] := 'True';
UniConnection.SpecificOptions.Values['UseUnicode'] := 'True';
UniConnection.OnError := OnConnectionError;
if AutoConnect then
UniConnection.Connect;
end;
destructor TItemUniOracle.Destroy;
begin
UniDataSource.Free;
UniMetaData.Free;
UniQuery.Free;
UniConnection.Free;
OracleUniProvider.Free;
inherited;
end;
procedure TItemUniOracle.OnConnectionError(Sender: TObject; E: EDAError;
var Fail: Boolean);
begin
//
end;
function TItemUniOracle.ReadConnected: Boolean;
begin
Result := UniConnection.Connected;
end;
procedure OnNew(ASender: TQSimplePool;var AData: Pointer);
begin
AData := TItemUniOracle.Create(nil,Config_Server,Config_UserName,Config_PassWord,True);
end;
procedure OnFree(ASender: TQSimplePool;AData: Pointer);
begin
TItemUniOracle(AData).Free;
end;
procedure onreset(ASender: TQSimplePool;AData: Pointer);
begin
//检查取来的Connect是否存活
if not TItemUniOracle(AData).Connected then
TItemUniOracle(AData).Connected;
TItemUniOracle(AData).UniQuery.SQL.Clear;
TItemUniOracle(AData).UniQuery.Active := False;
end;
{ TUniDacAnyPool }
procedure TUniDacAnyPool.AfterPop(ASender: TQSimplePool; AData: Pointer);
begin
//
end;
procedure TUniDacAnyPool.BeforePush(ASender: TQSimplePool; AData: Pointer);
begin
//
end;
function TUniDacAnyPool.Count: Integer;
begin
Result := Count;
end;
constructor TUniDacAnyPool.Create(AMaxSize:Integer);
begin
Pool := TQSimplePool.Create(AMaxSize,onnew,onfree,onreset);
Pool.AfterPop := AfterPop;
Pool.BeforePush := BeforePush;
end;
destructor TUniDacAnyPool.Destroy;
begin
Pool.Free;
inherited;
end;
function TUniDacAnyPool.pop: TItemUniOracle;
begin
Result := nil;
while Result = nil do
begin
Result := Pool.Pop;
if Result = nil then
TThread.Sleep(200);
end;
end;
procedure TUniDacAnyPool.push(ADate: TItemUniOracle);
begin
Pool.Push(ADate);
end;
initialization
finalization
end.
Delphi
1
https://gitee.com/suxuss_admin/EasWorkerTools.git
git@gitee.com:suxuss_admin/EasWorkerTools.git
suxuss_admin
EasWorkerTools
EAS工作流挂起监控工具
master

搜索帮助