全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2295
推到 Plurk!
推到 Facebook!

數個建置三層式Ap Server程式的問題~~

尚未結案
Mecer
初階會員


發表:15
回覆:30
積分:29
註冊:2002-10-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-06 22:53:50 IP:211.22.xxx.xxx 未訂閱
各位多層式架構的高手,小弟有數個問題困擾已久,還望有人幫小弟解答.. 我先說明一下我開發的三層式程式,首先,後端資料庫使用的是SQL 2000,接著,我的RDM總共有 五個,分別為RDM_Main, RDM_1, RDM_2 ... RDM_4, 在Type Library當中,再新增一個Interface (BaseRDM),RDM1 ~ 4均是繼承此Interface而來的(在Type Library當中的Attributes此頁的Parent Interface指向此BaseRDM),而RDM_Main當中宣告四個Read Only的Function,傳回值即為此四個 RDM1 ~ 4的Interface,程式碼如下: function TRDM_Main.Get_RDM_1: IRDM_1; begin Result := FRDM_1Factory.CreateComObject(nil) as IRDM_1; end; ^^^^^^此變數為RDM_1當中宣告的全域變數,型態為TComponentFactory 因為小弟是第一次設計三層式架構的程式,許多東西均是東抄西參考的,以上的架構好處似乎是在 當Client端連線時,可以動態的建立RDM1 ~ 4,沒有連線上的RDM就不會被建立起來,所以Client端 如果透過RDM_Main連上RDM3,則RDM1, RDM2, RDM4都不會被建立起來。 我的第一個問題是,TClassInstancing與TThreadingModel的配置,該如何配置?我試過全部的組合 ,以我的程式來說,RDM_Main的TClassInstancing與TThreadingModel配置,可以設定成一個Client 啟動一個Instance,或是所有的Client共用一個Instance,以及一個Thread可以服務幾個Request, 但是再往RDM1, .. , RDM4 設定下去,感覺似乎沒有任何差異,不知道是不是與我的Client程式有關 ?! 第二個問題,因為Ap Server如此建置,因此我的Client端程式除了透過Socket Connection的連線之 外,另外再拉了四個Shared Connection,Socket Connection是指向RDM_Main,因為RDM_Main有宣告 四個Function,且傳回值為Interface,所以在Shared Connection當中就可以透過指定 ParentConnection為RDM_Main的情況之下,指定此Shared Connection是指向哪一個ChildName(RDM1, RDM2, RDM3, RDM4),如此一來,當Client連線RDM_Main,又Open Shared Connection時,Ap Server 只會啟動RDM_Main,看起來似乎RDM1, RDM2, .. RDM4 都包在RDM_Main當中了,降子的設定與拉五個 Socket Connection有什麼不同?! 第三個問題,這個問題最令我頭大!在RDM_2當中,總共有七個AdoQuery,全部都是Master/Detail的 關係,七個AdoQuery共用一個DataSetProvider,Client端也拉了七個ClientDataSet,假設七個 AdoQuery分別為AdoQry1, AdoQry2, AdoQry3, .. AdoQry7, ClientDataSet分別為Cds1, Cds2, .. Cds7,其中Cds1會包含一個TDataSetField,這個TDataSetField其實就是AdoQry2, 所以Cds2的 DataSetField就可以指向此TDataSetField,然後以此類推,七個就通通包在一起了,我想大家應該 懂我的意思,當Client端新增資料時,只要下Cds1.ApplyUpdates(-1)就可以把七個資料表的異動資料 全部丟回去Ap Server,由RDM_2的DataSetProvider負責處理,因為Client丟回來的異動資料還有缺漏 ,因此DataSetProvider在BeforeUpdateRecord我又自行補齊資料。 目前問題是出在,如果同時間這七個資料表有三個以上的Client同時要寫入大量的資料,我試過很多 不同的寫法,都會造成不同的錯誤,有時候會造成死結!有時候會停在ApplyUpdate不動,大多數的情 況是其中二個Client會成功的寫完資料,會有一個Client停住,或是沒有停住,三個都寫完了,但其 實三個ApplyUpdate都有一些資料沒寫進去全部的七個資料表當中。 下ApplyUpdate時,Delphi會自動啟動一個Transaction,但我試過在Cds1 ~ 7 分別下ApplyUpdate, 企圖讓TranSaction小一點,但似乎都沒有用?! 最後一個問題,如果Ap Server的程式與DB Server裝在同一台電腦上,TClassInstancing與 TThreadingModel的配置跟裝在不同電腦上,是不是會有差異?我知道速度一定會有差,但是不是能夠 解決一些可能發生死結或停住的狀況?! 感謝大家耐心看完小弟的問題,描述不佳的地方還請見諒!第一次設計三層式的程式,還有很多要學 習的地方,上述的問題已經困擾我數月了,還請有經驗的高手們幫小弟解答一下,謝謝!感激不盡!
James
高階會員


發表:10
回覆:290
積分:220
註冊:2002-07-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-07 09:49:15 IP:61.218.xxx.xxx 未訂閱
參考一下 code6421 大大的文章 , 也許可以解答你的問題 http://code6421.ktop.com.tw/ 他有一篇 "Delphi 6 之 DataSnap 新特色" 應該就是你提到的問題
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-07 10:17:45 IP:203.204.xxx.xxx 未訂閱
引言: 我的第一個問題是,TClassInstancing與TThreadingModel的配置,該如何配置?我試過全部的組合 ,以我的程式來說,RDM_Main的TClassInstancing與TThreadingModel配置,可以設定成一個Client 啟動一個Instance,或是所有的Client共用一個Instance,以及一個Thread可以服務幾個Request, 但是再往RDM1, .. , RDM4 設定下去,感覺似乎沒有任何差異,不知道是不是與我的Client程式有關 ?!
這我也不清楚,也沒都試過,且測試不可能只有一、二個Client這樣試,一定是客戶的所有User按正常操作使用,所以沒有能實際測試!依目前使用BDE加預設的TClassInstancing與TThreadingModel配置,算還可以,偶而出現個程式沒有回應而已,ADO的話看Help,其中一個要配置Free。
引言: 第二個問題,因為Ap Server如此建置,因此我的Client端程式除了透過Socket Connection的連線之 外,另外再拉了四個Shared Connection,Socket Connection是指向RDM_Main,因為RDM_Main有宣告 四個Function,且傳回值為Interface,所以在Shared Connection當中就可以透過指定 ParentConnection為RDM_Main的情況之下,指定此Shared Connection是指向哪一個ChildName(RDM1, RDM2, RDM3, RDM4),如此一來,當Client連線RDM_Main,又Open Shared Connection時,Ap Server 只會啟動RDM_Main,看起來似乎RDM1, RDM2, .. RDM4 都包在RDM_Main當中了,降子的設定與拉五個 Socket Connection有什麼不同?!
這是Delphi7才有的(我錯了,看了Code6421文章才知Delphi6就有了),不然就要上http://distribucon.com/midas.html去抓,所以也沒用過,不同在於Socket Server上出現的Connection數,五個SocketConnection就會出現五個Connection,以致Socket Server的Thread Cache Size要設大一點才夠用,可能會比較浪費記憶體吧,但現在記憶體那麼便宜,只怕電腦不穩!
引言: 第三個問題,這個問題最令我頭大!在RDM_2當中,總共有七個AdoQuery,全部都是Master/Detail的 關係,七個AdoQuery共用一個DataSetProvider,Client端也拉了七個ClientDataSet,假設七個 AdoQuery分別為AdoQry1, AdoQry2, AdoQry3, .. AdoQry7, ClientDataSet分別為Cds1, Cds2, .. Cds7,其中Cds1會包含一個TDataSetField,這個TDataSetField其實就是AdoQry2, 所以Cds2的 DataSetField就可以指向此TDataSetField,然後以此類推,七個就通通包在一起了,我想大家應該 懂我的意思,當Client端新增資料時,只要下Cds1.ApplyUpdates(-1)就可以把七個資料表的異動資料 全部丟回去Ap Server,由RDM_2的DataSetProvider負責處理,因為Client丟回來的異動資料還有缺漏 ,因此DataSetProvider在BeforeUpdateRecord我又自行補齊資料。 目前問題是出在,如果同時間這七個資料表有三個以上的Client同時要寫入大量的資料,我試過很多 不同的寫法,都會造成不同的錯誤,有時候會造成死結!有時候會停在ApplyUpdate不動,大多數的情 況是其中二個Client會成功的寫完資料,會有一個Client停住,或是沒有停住,三個都寫完了,但其 實三個ApplyUpdate都有一些資料沒寫進去全部的七個資料表當中。 下ApplyUpdate時,Delphi會自動啟動一個Transaction,但我試過在Cds1 ~ 7 分別下ApplyUpdate, 企圖讓TranSaction小一點,但似乎都沒有用?! 最後一個問題,如果Ap Server的程式與DB Server裝在同一台電腦上,TClassInstancing與 TThreadingModel的配置跟裝在不同電腦上,是不是會有差異?我知道速度一定會有差,但是不是能夠 解決一些可能發生死結或停住的狀況?!
奇怪我用Delphi5只要是有異動資料,如果有共用DataSetProvider,後面更新那個就會異動失敗,所以都只有查詢才共用,死結都是資料庫要確保資料的完整性的控制所產生,所以要提高寫入資料庫的效能,如減少資料庫主機的負擔,增加硬體配備,調整資料庫效能,檢查程式效能!
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
發表人 - jieshu 於 2004/01/07 10:23:52
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
Mecer
初階會員


發表:15
回覆:30
積分:29
註冊:2002-10-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-07 16:50:38 IP:211.22.xxx.xxx 未訂閱
引言:奇怪我用Delphi5只要是有異動資料,如果有共用DataSetProvider,後面更新那個就會異動失敗,所以都只有查詢才共用,死結都是資料庫要確保資料的完整性的控制所產生,所以要提高寫入資料庫的效能,如減少資料庫主機的負擔,增加硬體配備,調整資料庫效能,檢查程式效能!
請教版主,怎麼樣「不共用」DataSetProvider? 不是很懂你的意思~透過相同 的程式,Open相同的ClientDataSet,連上相同的DataSetProvider,Open相同 的Query,但是在ApplyUpdates時卻不是用同一個DataSetProvider ?!
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-07 17:00:49 IP:203.204.xxx.xxx 未訂閱
引言: 請教版主,怎麼樣「不共用」DataSetProvider? 不是很懂你的意思~透過相同 的程式,Open相同的ClientDataSet,連上相同的DataSetProvider,Open相同 的Query,但是在ApplyUpdates時卻不是用同一個DataSetProvider ?!
你有說在RDM_2當中,總共有七個AdoQuery,全部都是Master/Detail的關係,七個AdoQuery共用一個DataSetProvider,Client端也拉了七個ClientDataSet,但我們不是,我們是一個ClientDataSet對應一個DataSetProvider對應一個DataSet阿,不會是你的Master/Detail有七層吧,我們頂多也只用到兩層(兩個DataSet共用一個DataSetProvider)。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
Mecer
初階會員


發表:15
回覆:30
積分:29
註冊:2002-10-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-07 18:19:44 IP:211.22.xxx.xxx 未訂閱
引言: 你有說在RDM_2當中,總共有七個AdoQuery,全部都是Master/Detail的關係,七個AdoQuery共用一個DataSetProvider,Client端也拉了七個ClientDataSet,但我們不是,我們是一個ClientDataSet對應一個DataSetProvider對應一個DataSet阿,不會是你的Master/Detail有七層吧,我們頂多也只用到兩層(兩個DataSet共用一個DataSetProvider)。[/green]
我的資料結構是有七個資料表,其中有五層Master/Detail,另外二個資料表是 因為要記錄的東西太多,從這五個當中的二個資料表又切割出來的。 Client端在寫入資料時,七個資料表的資料都要一起寫入,如果拆成七個DSP, 那麼在寫入資料時,該怎麼維護Master/Detail的關聯? 說明一下我原先的作法.. 在RDM_2當中,宣告六個Global變數,分別為key1, key2, ... key6 在DSP.BeforUpdateRecord當中,去判斷此次觸發Update的是哪一個DataSet, 因為總共有七個DataSet,所以寫了七個Procedure去做個別應做的Update, 倘若此次Update是Query1,則呼叫Procedure Udp1,此Procedure會去取得 Table1的最新Primary Key值,並且把此值存入key1,當下次Update是Query2 時,呼叫Procedure Udp2,此Procedure會去取得Table2的最新Primary Key值 ,並且把此值存入key2,另外再把key1的值帶入,寫入Table2,....以此類推 。 發表人 - Mecer 於 2004/01/07 18:27:27
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-07 18:59:08 IP:203.204.xxx.xxx 未訂閱
引言: 我的資料結構是有七個資料表,其中有五層Master/Detail,另外二個資料表是 因為要記錄的東西太多,從這五個當中的二個資料表又切割出來的。 Client端在寫入資料時,七個資料表的資料都要一起寫入,如果拆成七個DSP, 那麼在寫入資料時,該怎麼維護Master/Detail的關聯? 說明一下我原先的作法.. 在RDM_2當中,宣告六個Global變數,分別為key1, key2, ... key6 在DSP.BeforUpdateRecord當中,去判斷此次觸發Update的是哪一個DataSet, 因為總共有七個DataSet,所以寫了七個Procedure去做個別應做的Update, 倘若此次Update是Query1,則呼叫Procedure Udp1,此Procedure會去取得 Table1的最新Primary Key值,並且把此值存入key1,當下次Update是Query2 時,呼叫Procedure Udp2,此Procedure會去取得Table2的最新Primary Key值 ,並且把此值存入key2,另外再把key1的值帶入,寫入Table2,....以此類推 。
你說的應該是Transaction問題,如果其中一個失敗的話,就要Rollback,我都是寫一個Update的Function給Client呼叫,傳入ClientDataSet.Delta,然後用DataSetProvider.ApplyUpdates更新。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-04-30 13:45:04 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-03-29 12:56:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!