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