DataSnap資料庫連線池,資料集物件池的應用
傳統的應用伺服器的開發往往是在ServerMethods單元中拖放一堆TDataSet, TDaTaSetProvider控制元件,這是一個最簡單粗暴的開發方向,往往會造成服務端程式檔案的臃腫、服務執行期間記憶體資源消耗過大的問題。因此這種往應用伺服器中拖放一堆TDataSet, TDaTaSetProvider控制元件的做法,非常的笨拙。
當然了,如果我們的系統採用的是以短連線的方式的話,那就可以每次直接TDataSet.Create(nil);然後Free;但是這種方法對伺服器的開銷很大,因為每執行一個服務都需要重複開闢記憶體空間,銷燬記憶體空間等。
為此,我們可以通過使用物件池方法來改進之。
一、資料庫連線池:TConnection物件池
二、資料集物件池:TDataSet和TDataSetProvider的池化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.
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 伺服器,設定如圖所示 一、