1. 程式人生 > >DataSnap資料庫連線池,資料集物件池的應用

DataSnap資料庫連線池,資料集物件池的應用

    傳統的應用伺服器的開發往往是在ServerMethods單元中拖放一堆TDataSet, TDaTaSetProvider控制元件,這是一個最簡單粗暴的開發方向,往往會造成服務端程式檔案的臃腫、服務執行期間記憶體資源消耗過大的問題。因此這種往應用伺服器中拖放一堆TDataSet, TDaTaSetProvider控制元件的做法,非常的笨拙。

    當然了,如果我們的系統採用的是以短連線的方式的話,那就可以每次直接TDataSet.Create(nil);然後Free;但是這種方法對伺服器的開銷很大,因為每執行一個服務都需要重複開闢記憶體空間,銷燬記憶體空間等。

    為此,我們可以通過使用物件池方法來改進之。

一、資料庫連線池:TConnection物件池

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.
二、資料集物件池: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(sql: 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(sql: 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 := sql;
        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.

相關推薦

DataSnap資料庫連線資料物件應用

    傳統的應用伺服器的開發往往是在ServerMethods單元中拖放一堆TDataSet, TDaTaSetProvider控制元件,這是一個最簡單粗暴的開發方向,往往會造成服務端程式檔案的臃腫、服務執行期間記憶體資源消耗過大的問題。因此這種往應用伺服器中拖放一堆TD

解決ArcSDE與資料庫連線資料編輯的問題

轉載:ArcGIS 10.2匯入ArcSDE圖層不能編輯的問題 10.0之後在SDE資料庫方面有了一些調整。 在SDE資料庫中匯入或者建立要素,如果要在桌面版中進行編輯,需要先進行註冊。步驟如下: 1、建立資料庫連線 2、新建空間要素 3

小整數物件大整數物件

小整數物件池 (在python內建了) 整數在程式中的使用非常廣泛,Python為了優化速度,使用了小整數物件池,避免為整數頻繁申請和銷燬記憶體空間。 Python對小整數的定義是[-5,257]這些整數物件是提前建立好的,不會被垃圾回收。在一個Python的程式中,所有位

0.powerdesigner資料庫連線失敗 解決JDK64位問題

1、MySQL資料庫連線(JDBC方式) JDBC的配置方式需要一些基礎的環境和準備,但是也很簡單,無非也就是JDK和mysql的連線jar包,這裡不再展開闡述。 1.1 新建一個pdm,dbms選擇mysql 1.2 Database - Connect  選擇資料庫連

eyoucms資料庫連線失敗請重新設定

安裝易優CMS時,在連線資料庫那一步出現 “資料庫連線失敗,請重新設定”,解決方法如下: 第一:首先確保填寫的連線資料庫資訊要正確; 第二:資料庫資訊無誤的情況下,還提示 “資料庫連線失敗,請重新設定”,請按F12 檢視是否500錯誤; 如果像這樣的問題,那就是你購買的香港虛擬空間或者其

undo表空間建立 : 資料庫恢復必備資料保護體制

undo表空間建立:  create undo tablespace UNDOTBS1 datafile '/opt/oracle/oradata/CMCCWAP/undotbs01.dbf' size 200m autoextend on; .檢視資料庫的預設UNDO表空間

資料庫連線失敗更新密碼

Navicat連線Mysql8.0.11出現2059錯誤 2018年04月24日 09:05:05 閱讀數:5422更多 所屬專欄: 資料庫 昨天為了匯入一個sql, 我解除安裝了mysql,又重灌的,結果命令列直接使用麼問題,但是用navicat連線, 就一直在報2059的錯誤 在網上

機器學習 深度學習資料彙總(含文件資料程式碼等) 三

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

python使用自帶SVM資料iris

轉至:https://www.cnblogs.com/luyaoblog/p/6775342.html 和Python3不是很相容,改了一部分 import numpy as np from sklearn import svm import matplotlib as mpl impo

Python-Numpy多維陣列--概述資料型別物件陣列的屬性陣列的建立流程

一、Numpy概述          Numpy 是一個 Python 包(Numeric Python)。它是一個由多維陣列物件和用於處理陣列的集合組成的庫。 Numpy 擁有線性代數和隨機數生成的內建函式。Numpy 通常與 Sci

資料庫連線:操作資料增刪改查

<?php $db = new MySQLi("localhost","root","12345678","heiheihei"); //連線資料庫 $sql = "select * from student "; //寫sql語句 $r = $db->query($sql); //執行sql語

mysql 開啟資料庫連線出現1130 -host 'localhost' is not allowed 。。的解決辦法

    出現這個問題的原因是系統升級的補丁,禁止任何 IP 連線本機。      找到mysql 的安裝目錄,不要在navicate 的快捷方式上單擊右鍵,那樣找到的不是MYSQL 資料庫的目錄,在【程式】列表中找到路徑。      定位到\MySQL\MySQL Serv

易優cms資料庫連線失敗請重新設定

如果像這樣的問題,那就是你購買的香港虛擬空間或者其他空間的問題,是沒有開啟php的json 擴充套件導致,只要開啟就可以了。比如:某個香港主機的虛擬空間就有這問題,一定要勾選這些東西,才能安裝使用易優CMS。

網站出現資料庫連線失敗mysql 2003錯誤(10061) 的解決方法

這幾天有一臺MySQL資料庫伺服器出現了頻繁的掉線情況,通過排查,並沒有排查出哪個網站被攻擊,百思不得其解中的時候,群裡有個朋友說是因為微軟KB967723造成的,網上搜索了一下,果然很多人都是這樣的問題,都是windows系統下安裝的MySQL造成的 網上一共提供了兩種方法: 第一種:解除安裝KB967

C# + ArcEngine讀取檔案地理資料庫fileGDB中的資料和要素類生成目錄樹

首先是得到了工作空間中的要素資料集,即EnumDataSet物件,通過第一個引數傳遞進來;第二個引數是樹節點,要把遍歷得到的資料集的名字新增到該節點上,也是通過引數傳遞進來;當然,此方法前面的程式碼是要讀取工作空間,得到要素資料集EnumDataSet物件,並建立好樹節點,最

VS2010 RDLC報表製作詳解 分組空白頁合計資料引數頁數

1.新增資料集 2.在資料集中新增資料表和對應的欄位 3.新增RDLC報表 3.製作報表 A)右件新增頁首,頁首和頁尾,(頁首和頁尾會在每一頁顯示); B)新增報表引數(快捷鍵 ctrl+Alt+D 或者檢視-》報表資料) C)對錶裡的組進行強制分頁, 1. 工具

android利用ksoap2返回複雜資料資料(dataset)

在讀這篇文章之前建議你先讀一下上一篇文章android如何使用ksoap2對sql server的操作實現登陸,原理是一樣的只是返回的資料不同而已。 web端程式碼: //database.cs檔案利用ADO.NET技術 public DataSet G

linq初入交叉連線查詢兩個物件之間分別匹配

型別 查詢變數= from 臨時變數 in 集合物件或資料庫物件             [where 條件表示式]             [order by 條件]             select 臨時變數中被查詢的值             [group by

語料庫資料

搜狗實驗室(Sogou Labs) : http://www.sogou.com/labs/resources.html?v=1 您所需要的資料量較大(壓縮後的網路語料庫都在100G以上,而壓縮後的圖片資料庫近 2T),網路下載已經無法滿足需求,請您按照以下的

Jmeter 連線Redis獲取資料

  公司開展了新的業務活動,需要配合其他部門做壓測,由於指令碼中的手機號和使用者的uid需要引數化而且每次均不能重複,最初的考慮使用csv的方式來獲取資料,比較頭疼的問題是叢集節點需要維護測試資料,所以我將所有資料統一儲存到使Redis中,Redis 將測試資料提供給Jmeter 伺服器,設定如圖所示 一、