日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

datasnap 2011连接池,数据集对象池

發布時間:2024/4/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 datasnap 2011连接池,数据集对象池 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

那種往應用服務器中拖放一堆TDataSet, TDaTaSetProvider控件的做法,非常的笨拙??梢酝ㄟ^使用對象池來改進之。

?

數據集對象池

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/2011/02/05/2940922.html

總結

以上是生活随笔為你收集整理的datasnap 2011连接池,数据集对象池的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。