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

2021-07-05 10:32:39 字數 4855 閱讀 5921

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

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

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

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

end.二、資料集物件池:tdataset和tdatasetprovider的池化

unit servermethodsunit1;

inte***ce

uses

sysutils, classes, dsserver, db, generics.collections, dsservice, provider,

adodb;

type

tservermethods1 = class(tdsservermodule)

procedure dsservermodulecreate(sender: tobject);

private

listofquery : tdictionary;

listofprovider : tdictionary;

function _getquery(sql: string; exeno: integer) : tadoquery;

function _getprv(sql: string; exeno: integer) : tdatasetprovider;

public

function getprovidername(sql: string; exeno: integer): string;

end;

implementation

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(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.

資料庫連線池 Redis連線池

基本原理 在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。如外部使用者可通過getconnection方法獲取資料庫連線,使用完畢後再通過releaseconnection方法將連線返回,注意此時的連線並沒有關閉,而是由連線池管理器 並為下一次使用做好準備。2.作用 ...

資料庫連線池

實現資料連線池,讓系統有更高有執行效率 using system using system.data using system.data.sqlclient using system.collections using system.threading public class dataaccess...

資料庫連線池

資料庫連線池概述 資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池正是針對這個問題提出來的。資料庫連線池負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有...