77范文网 - 专业文章范例文档资料分享平台

数据集连接池

来源:网络收集 时间:2020-08-21 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

数据集连接池的创建

当开发人员开始创建Delphi的DataSnap应用时很常见的数据库连接定义方式是每个数据模块建立一个连接。这样做将产生大量的数据库连接,并产生很多问题。

DelphiXe,提供了Session管理,更容易实现控制客户端连到服务器的数据库连接。客户端应用程序不会知道这些,服务器将完成所有的事情。

当我们创建一个DataSnap服务器时,最好的做法就是定义一个服务器容器(数据模块),其中包含DataSnap服务器组件和注册所有的服务器应用程序所需的类。在这个容器中,我们将定义一个负责处理服务器的数据库连接的方法。

作为一个例子,我已经实现了服务器容器上的一个的getConnection方法。这个方法负责 为连接池分配连接,这将有每一个客户端连接列表寻找,连接池里包含有每个客户端的连接。 private

{ Private declarations }

ListofConnection : TDictionary; public

function GetConnection : TSQLConnection;

当服务器收到来自新的客户端的连接到数据库的请求时,getConnection将创建一个新的连接并添加到 连接池清单。如果客户已经有了一个连接相关联,getConnection则只返回的一个SqlConnection实例

。连接池使用线程ID来控制每个客户端的唯一连接。如果您使用的DataSnap2010,你必须用GetThreadSession方法来实现这个功能。

function TServerContainer1.GetConnection: TSQLConnection; var

dbconn : TSQLConnection; begin

if ListofConnection.ContainsKey(TDSSessionManager.GetThreadSession.Id) then Result := ListofConnection[TDSSessionManager.GetThreadSession.Id] else begin

dbconn := TSQLConnection.Create(nil); dbconn.Params.Clear;

dbconn.LoadParamsOnConnect := true; dbconn.ConnectionName := 'DS Employee';

ListofConnection.Add(TDSSessionManager.GetThreadSession.Id, dbconn); Result := dbconn; end; end;

连接定义后,我们需要更新所有数据集使用此连接,这样服务器的所有方法包括create 和运行时的SQL查询都将要调用getConnection方法。

If you are using the VCL Data components (TSQLQuery, TSQLStoredProc, etc…) on your Server DataModules, the onCreate event is a good place to associate the DataSets with the connection, using the following code.

如果您在服务器上DataModules使用VCL的数据组件(TSQLQuery,TSQLStoredProc等...), 在OnCreate事件是一个设置关联数据集的连接的好地方,可以使用下面的代码来设置。

1 / 8

数据集连接池的创建

procedure TServerContainer1.SetConnection(Conn: TSqlConnection); var

i: integer; begin

if Conn = nil then

Conn := GetConnection; else

Conn := Sender;

for i := 0 to ComponentCount - 1 do if Componentsis TSQLQuery then

TSQLQuery(Components).SQLConnection := Conn; end;

为了避免数据库连接泄漏,我们实现了DSServer的OnDisconnect事件。当客户端断开连接时这段持续将运行。 if GetConnection <> nil then GetConnection.Close;

可以用此方法实现数据集池以及TDataSetProvider池

那种往应用服务器中拖放一堆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;

ListofProvider : TDictionary;

function _GetQuery(asql: string; exeNo: Integer) : Tadoquery;

2 / 8

数据集连接池的创建

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.Create;

Listofprovider := TDictionary.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

3 / 8

数据集连接池的创建

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

4 / 8

数据集连接池的创建

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; public

function GetConnection : TadoConnection; end; var

ServerContainer1: TServerContainer1;

implementation

uses Windows, ServerMethodsUnit1,uConst;

{$R *.dfm}

procedure TServerContainer1.DataModuleCreate(Sender: TObject); begin

ListofConnection := TDictionary.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

5 / 8

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库数据集连接池在线全文阅读。

数据集连接池.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/jiaoyu/1144053.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: