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老師解答我的這個困惑,不甚感激
我具體的架構以及主要的程式如下:
應用服務器:
一: 針對主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老師解答我的這個困惑,不甚感激