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.
文章来源:
http://apps.hi.baidu.com/share/detail/46395834
分享到:
相关推荐
Delphi XE2 DataSnap 链接池 数据集池 池例子
Delphi Xe2 Datasnap 链接池数据集池
Delphi XE2 DataSnap业务对象池demo .zip
DELPHI 连接池 类 应用于DATASNAP 上的连接池类
DataSnap通过json上传数据集到服务端并解释
DelphiXE7编写的基于DataSnap的三层数据库应用,可以通过客户端返回动态数据集,客户端也可以根据对数据集的修改,生成相应的修改SQL提交到服务端执行,且服务端的连接数据库部分不需要安装Oracle客户端。...
Datasnap 使用JSON 传递数据的简易方法.mht
DataSnap通过自定义sql查询数据
android java 调用delphi DX10 datasnap 接口 网络连接不成功的解决办法
解决问题:delphi D10下(XE8\XE7),DataSnap连接超时设置在android中使用无效,导致不能连接服务器时长时间等待。补丁包带源码及说明。 Datasnap ConnectTimeout android
分别用于连接服务器和客户端向服务器注册;TDSClientCallbackChannelManager要指明通道名(ChannelName)、通信类型(CommunicationProtocol=TCP/IP)、服务器地址(DSHostname)及端口(DSPort)。
的服务器安全连接方法,服务器方法返回只读的数据集,datasetproviders返回主从数据集的自动增量 的主键,(以及如何处理这些),使用基于角色的认证和授权,以确保不仅是服务器方法,但也暴露 datasetproviders,...
DataSnap Demo:TFDConnection、最大连接数、客户端回叫功能、多线程模拟、压力测试等,编译环境XE6 Update 1
delphi xe DataSnap连接超时设置无效,下载这个补丁到应用程序所在目录即可,文件内有说明
在Delphi中使用Rest Severs的pdf书籍和相关源码,是学习Delphi Rest架构的很好资料。
Android studio客户端连接 Delphi XE REST DataSnap服务器
在xe5(delphi)下编译的,估计在xe2以上版本中都可以编译。因为编译后的可执行文件太大了,这次就没有提供.exe文件.
对象池的一个小例子,可以参考一下,个人感觉还可以。
cb2010_DataSnap_demo 从服务端的 access数据库读取数据到客户端,在C++Building2010下编译通过
datasnap2010 中文白皮书 datasnap2010 中文白皮书 datasnap2010 中文白皮书