關於應用服務器內存佔用比較高的問題(200分)

  • 主题发起人 qinmingzsj
  • 开始时间
Q

qinmingzsj

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用DELPHI6開發了一個關於三層的C/S企業應用程式,但是根據多日的觀察,發現應用服務器的內存一天一天的增加,因此想請教一下DFW針對我的程式是否有好的解決方案.
我具體的架構以及主要的程式如下:
應用服務器:
一: 針對主TRemoteDataModule
1. 主TRemoteDataModule模塊(DM_SERVER),為了將數據庫的連接統一我在DM_SERVER使用了一個TADOConnection (adoCN_Server)
2. 在DM_SERVER中我定義了一個屬性(Connection)以代表adoCN_Server提供給子TRemoteDataModule模塊
具體調用程式:
function TDM_SERVER.Get_Connection: Integer;
begin
Result := Integer(adoCN_Server);
end;
3. 在在DM_SERVER中我定義了10個屬性代表10個子TRemoteDataModule提供給客戶端
具體程式(只力例舉了一個):
function TDM_SERVER.Get_PQIN_GSD_PACKRM: IQIN_GSD_PACKRM;
begin
Result := FQIN_GSD_PACKRM.CreateComObject(nil) as IQIN_GSD_PACKRM;
Result.MainRm := self;
Result.Connection := Get_Connection;
end;
4 我定義了一個了被其他子TRemoteDataModule繼承的介面IBASE_RM,在其中我又定義了幾個屬性: MainRm(Read/Write) 取得TRemoteDataModule模塊(DM_SERVER)
Connection 取得TRemoteDataModule模塊(DM_SERVER)中的數據庫的連接
5 我定義了10個 子TRemoteDataModule(繼承了IBASE_RM) 在10個 子TRemoteDataModule中我做了如下動作:
(只力例舉了一個):
5.1
var
FQIN_GSD_PACKRM: TComponentFactory;
作為主TRemoteDataModule獲取子TRemoteDataModule全局變量
5.2
function TQIN_GSD_PACKRM.Get_MainRm: IDM_SERVER;
begin
Result := FMainDM
end;
//取得TRemoteDataModule模塊(DM_SERVER)
procedure TQIN_GSD_PACKRM.Set_MainRm(const Value: IDM_SERVER);
begin
FMainDM := Value;
end;
procedure TQIN_GSD_PACKRM.Set_Connection(Value: Integer);取得數據庫連接
var
Icount: integer;
begin
FCon := Value;
for Icount := 0 to ComponentCount - 1do
begin
if Components[Icount] is TCustomADODataSet then
TCustomADODataSet(Components[Icount]).Connection := TADOConnection(Value);
end;
end;
10個 子TRemoteDataModule中定義了其他業務邏輯(省略),以及(TADODataSet組件.和相應的DataSetProvider組件)
客戶端:
一: 針對客戶端的TDataModule(COMMEM_DM)
1. 在COMMEM_DM中我加入了一個TSocketConnection(ScC_COMMEM_DM) ,一個TSimpleObjectBroker(SOBroker)以及10個TSharedConnection
2. TSocketConnection(ScC_COMMEM_DM)連接SERVER(SERVER.DM_SERVER)以及SOBroker
3. 10個TSharedConnection的Parentconnection連接ScC_COMMEM_DM, ChileNmae分別連接10個不同的介面.
4. 我另外加入了10個不同的TDataModule,在其中加入了相應的TClientDataSet組件
5. 客戶現在只有16個模塊使用.
問題:
1. 客戶端少的時候沒有發現任何問題.
2. 當我的客戶端超過60多個達到150的時候我觀察到應用服務器的EXE文件所佔用的記憶體達到200-400多MB
3. 當我不關閉應用服務器, 應用服務器的EXE文件所佔用的記憶體每天以100多MB的速度增加
4. 而且當我用三台客戶端測試的時候,我發現如果我退出兩個客戶端,只要有一個客戶端連接.先前的應用服務器的EXE文件所佔用的記憶體並沒有釋放,是不是在應用服務器客戶端連接的那些子遠程數據模塊沒有釋放呢?
5. 因為整個項目中有200多個模塊,客戶端有200多台,如果照這樣的話,我的應用服務器豈不很快就會崩潰.
6. 數據庫方面應該不用考慮,因為我以前的兩層用此沒有問題.
是不是我的架構設計有問題,還是其他方面沒有考慮到? 敬請DFW老師解答我的這個困惑,不甚感激
 
个人认为楼主这个方法有点问题
Get_PQIN_GSD_PACKRM 每一次调用就创建一个 是否有相应的地方释放呢?
我也用三层做应用,使用的是类工厂模型控制RDM的创建,也遇到内存占用的问题
我的做法是一个每个rdm一个线程,rdm被创建后就不被释放,每个客户端调用请求进来的时候首先看是否有空闲的rdm,如果有则分配给这个请求调用,如果没有则新创建一个rdm给这个请求调用。为避免内存占用过大的问题,通过一个参数控制最大rdm的个数。
 
ball_cao:
謝謝你,我也認為這個有些問題. Get_PQIN_GSD_PACKRM 每一次调用就创建一个 是否有相应的地方释放呢?
我也不是很清楚,但是我在Client端使用TSharedConnection連接這個interface,當我在客戶端使用TSharedConnection.Close的時候,它應該要釋放這個interface的,不知道對不對?
如果不是這樣釋放,那我應該怎樣去釋放這個PQIN_GSD_PACKRM ,不知道ball_cao兄是否可以指點一二.
另外,ball_cao兄的类工厂模型控制RDM的创建實現方法不知道具體是怎樣實現的,是否可以給我更多的提示?
甚盼回答!!
 
ball_cao兄:
我的QQ是151723846,不知道是否可以和你交個朋友
 
去塞格再买个内存加上[:D]
 
qq:47654763
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部