那种往应用服务器中拖放一堆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连接池,数据集对象池相关推荐

  1. Netty源码剖析之内存池和对象池设计流程

    1.为什么需要池化内存 Netty 作为底层网络框架,为了更高效的网络传输性能,堆外内存(Direct ByteBuffer)的使用是非常高频的. 堆外内存在 JVM 之外,在有效降低 JVM GC ...

  2. C++内存池、对象池

    使用C/C++实现内存池技术 使用C/C++实现内存池技术 内存管理技术是开发多媒体应用和服务的很重要的知识.DMSP应用中会有频繁的缓冲区的创建和释放操作,这些操作会降低程序的运行效率和运行时间.本 ...

  3. java开源对象池_JAVA 对象池

    GenericObjectPool利用一个org.apache.commons.collections.CursorableLinkedList对象来保存对象池里的对象.这种对象池的特色是: 可以设定 ...

  4. 对象池回收对象_回收对象以提高性能

    对象池回收对象 总览 在上一篇文章中,我说过对象反序列化更快的原因是由于使用了回收对象. 由于两个原因,这可能令人惊讶:1)相信如今创建对象是如此之快,无关紧要或与回收自己一样快,2)默认情况下,任何 ...

  5. java构建内存池队列_池化技术(线程池、连接池、内存池等)

    一.池化技术 - 简单点来说,就是提前保存大量的资源,以备不时之需. 对于线程,内存,oracle的连接对象等等,这些都是资源,程序中当你创建一个线程或者在堆上申请一块内存时,都涉及到很多系统调用,也 ...

  6. 设计模式之对象池模式

    对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并 ...

  7. java timetasker_Java网络与多线程系列之1:实现一个简单的对象池

    前言 为什么要从对象池开始呢,先从一个网络IO操作的demo说起 比如下面这段代码,显而易见已经在代码中使用了一个固定大小的线程池,所以现在的重点在实现Runnble接口的匿名对象上,这个对象每次创建 ...

  8. 抓到Netty一个隐藏很深的内存泄露Bug | 详解Recycler对象池的精妙设计与实现

    本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的时候,不小心用我的肉眼抓到了一个隐藏很深很深的内存泄露 Bug. 于是笔者将这个故事-哦不 -事 ...

  9. “池化技术”漫谈 - 线程池,内存池,连接池……

    池化技术 - 简单点来说,就是提前保存大量的资源,以备不时之需,O(∩_∩)O,对于线程,内存,oracle的连接对象等等,这些都是资源,程序中当你创建一个线程或者在堆上申请一块内存时,都涉及到很多系 ...

最新文章

  1. spark编程基础--4.2在spark-shell中运行代码
  2. windows下定期清理超过一定时间的文件
  3. SharePoint 2013 配置HTTPS(SSL)
  4. iOS 汉字转拼音 PinYin4Objc
  5. Unisys:信息安全新关键——微分割
  6. PAT甲级1140 Look-and-say Sequence:[C++题解]统计连续个数
  7. php本身免费是啥意思,PHP本身是否支持连接和析取?
  8. VTK:可视化之HedgeHog
  9. c语言字符串倒置,单词倒置,用C++实现,将一句话里的单词进行倒置的方法详解
  10. 《实现模式(修订版)》—第2章模式
  11. 中国象棋程序的设计与实现(七)--心得体会和开发日志
  12. 今天发生在自己身上的搞笑事情是什么呢?
  13. Python GStreamer Tutorial
  14. 离散数学及其应用 第一章习题
  15. 句子迷 APP,MVP 架构,Okhttp + Retrofit + RxJava,图片加载 Glide,数据库 Object-box
  16. GitLab 项目管理和代码托管平台
  17. LINUX 测试resnet18时,找不到模型 no checkpoint fount
  18. MySql创建Table的时候将编码设置为utf-8
  19. 女人一生中重要的三件事。
  20. 从零开始速通百度云网盘

热门文章

  1. jquery动态加载JS【方法getScript】的改进
  2. mysql备份、导入、远程数据库设置
  3. CyanogenMod源码编译模拟器
  4. HDOJ 1056 HangOver
  5. mac下用scp命令实现本地文件与服务器Linux文件之间的相互传输
  6. vs2015通过ODBC连接SQLSERVER2012
  7. 特殊方法,类之间的关系,分页
  8. LINUX系统管理员技术(Admin)-------第二天
  9. _exit()函数与exit()函数的区别
  10. 实现手电筒Flash Light 关键代码