泛型实现的对象池
数据集对象池
unit ServerMethodsUnit1;
interface
uses
SysUtils, Classes, DSServer, DB, Generics.Collections, DSService, Provider,
ADODB;
type
TServerMethods1 = class(TDSServerModule)
procedure DSServerModuleCreate(Sender: TObject);
private
{ Private declarations }
ListofQuery : TDictionary<Integer,Tadoquery>;
ListofProvider : TDictionary<Integer,Tdatasetprovider>;
function _GetQuery(asql: string; exeNo: Integer) : Tadoquery;
function _GetPrv(sql: string; exeNo: Integer) : Tdatasetprovider;
public
{ Public declarations }
function GetProviderName(sql: string; exeNo: Integer): string;
end;
implementation
{$R *.dfm}
uses StrUtils, DSServerContainer, uConst;
procedure TServerMethods1.DSServerModuleCreate(Sender: TObject);
begin
Listofquery := TDictionary<Integer, Tadoquery>.Create;
Listofprovider := TDictionary<Integer, Tdatasetprovider>.Create;
end;
function TServerMethods1._GetPrv(sql: string; exeNo: Integer): Tdatasetprovider;
var
dbprv : Tdatasetprovider;
begin
if ListofProvider.ContainsKey(exeNo) then
Result := ListofProvider[exeNo]
else
begin
if ListofProvider.Count <= g_MaxPoolSize then
begin
dbprv := TDataSetProvider.Create(Self);
dbprv.Name := 'dsp'+ IntToStr(exeNo);
dbprv.DataSet := _GetQuery(sql, exeNo);
ListofProvider.Add(exeNo, dbprv);
Result := dbprv;
end;
end;
end;
function TServerMethods1._GetQuery(asql: string; exeNo: Integer): Tadoquery;
var
qry : TADOQuery;
begin
if Listofquery.ContainsKey(exeNo) then
Result := ListofQuery[exeNo]
else
begin
if ListofQuery.Count <= g_MaxPoolSize then
begin
qry := TADOQuery.Create(Self);
with qry do
begin
Connection := ServerContainer1.GetConnection;
Name := 'qry'+ IntToStr(exeNo);
close;
sql.Clear;
sql.Text := asql;
open;
end;
ListofQuery.Add(exeNo, qry);
Result := qry;
end;
end;
end;
function TServerMethods1.GetProviderName(sql: string; exeNo: Integer): string;
begin
Result := _GetPrv(sql, exeNo).Name;
end;
end.
连接池
unit DSServerContainer;
interface
uses
SysUtils, Classes,
DSTCPServerTransport,
DSServer, DSCommonServer, DSAuth, DB, ADODB, Generics.Collections, DSService,
DBXDataSnap, DBXCommon, DSHTTPLayer, DBXinterbase, forms;
type
TServerContainer1 = class(TDataModule)
DSServer1: TDSServer;
DSTCPServerTransport1: TDSTCPServerTransport;
DSServerClass1: TDSServerClass;
procedure DSServerClass1GetClass(DSServerClass: TDSServerClass;
var PersistentClass: TPersistentClass);
procedure DataModuleCreate(Sender: TObject);
procedure DSServer1Disconnect(DSConnectEventObject: TDSConnectEventObject);
private
{ Private declarations }
ListofConnection : TDictionary<Integer,TadoConnection>;
public
function GetConnection : TadoConnection;
end;
var
ServerContainer1: TServerContainer1;
implementation
uses Windows, ServerMethodsUnit1,uConst;
{$R *.dfm}
procedure TServerContainer1.DataModuleCreate(Sender: TObject);
begin
ListofConnection := TDictionary<Integer, TadoConnection>.Create;
end;
procedure TServerContainer1.DSServer1Disconnect(
DSConnectEventObject: TDSConnectEventObject);
begin
if GetConnection <> nil then
GetConnection.Close;
end;
procedure TServerContainer1.DSServerClass1GetClass(
DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass);
begin
PersistentClass := ServerMethodsUnit1.TServerMethods1;
end;
function TServerContainer1.GetConnection: TadoConnection;
var
dbconn : TadoConnection;
begin
if ListofConnection.ContainsKey(TDSSessionManager.GetThreadSession.Id) then
Result := ListofConnection[TDSSessionManager.GetThreadSession.Id]
else
begin
if ListofConnection.Count <= g_MaxPoolSize then
begin
dbconn := TadoConnection.Create(Self);
dbconn.Name := 'con'+ IntToStr(TDSSessionManager.GetThreadSession.Id);
dbconn.LoginPrompt := false;
dbconn.ConnectionString := 'FILE NAME=' + extractfilepath(application.ExeName) + 'connect.udl';
ListofConnection.Add(TDSSessionManager.GetThreadSession.Id, dbconn);
Result := dbconn;
end;
end;
end;
end.
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/archive/2012/02/20/2360649.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本