欢迎来到天天文库
浏览记录
ID:21749545
大小:484.00 KB
页数:20页
时间:2018-10-24
《如何使用delphi开发大型主从架构系统-package的秘密和威力》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、如何使用Delphi開發大型主從架構系統-Package的秘密和威力相信許多人和我一樣,在使用Delphi開發應用系統的時候,一定會想到如何的切割整個應用系統。是把所有的子系統撰寫成一個很大(可能會有數M.Bytes的大小)的EXE檔呢?還是應該把每一個模組撰寫在不同的EXE檔案之中的好。事實上這兩種方法都有它們自己的問題。如果是把所有的模組撰寫在一個EXE檔案之中的話,那麼不但執行檔太大,不易更新和維護。在開發時也不甚方便,因為要讓數個人撰寫同一支應用程式的確比較麻煩。那麼如果我們把每一個模組讓不同的程式師撰寫成獨立的EXE檔案,再
2、由一個主程式分別啟動不同的EXE檔不就好了嗎?沒錯這是許多人使用的方法(包括我在內),但是這樣切割應用系統有一個問題,那就是如果每一個獨立的EXE模組,都需要使用資料庫的話,那麼當主程式啟動個別的EXE檔案時,每一個EXE都必須重新再連結到資料庫,開啟資料庫表格,再取得它需要的資料。這個過程通常都需要不少的時間。例如連結到Oracle並且開啟一個資料庫表格的話,通常需要五到十秒。如果EXE開啟的資料庫表格或是查詢比較多的話,那麼主程式在啟動獨立的EXE檔案時,通常需要30幾秒到一分鐘不等。這對於許多的使用者而言是非常不方便的。這樣的狀
3、狀甚至會造成你的專案無法交貨(例如使用者要求在五秒之內EXE程式的畫面必須出現)。除此之外,每一個獨立的EXE又使用了額外的連結以便存取資料庫,造成了資源的浪費。面對這種二難的局面,你現在的選擇是什麼呢?事實上這個問題在我的心中也盤旋了許久。因為這一是我想要解決的問題,只是由於工作的繁忙讓我一直無法花時間解決它。最近在手上的事情告一段落之後,又接到許多朋友的詢問,所以決定花一些時間試著解決這個重要的問題。增加應用程式載入的效率如果我們仔細的思考這個問題的話,就可以發現問題出在每一支獨立的EXE都需要重複的連結資料庫所至。所以如果我們可
4、以讓連結到資料庫的次數減少的話,不就可以加快應用程式載入的效率了嗎?這個想法當然很簡單,但是問題是要如何的減少應用程式連結資料庫的次數呢?事實上這個想法也很簡單,最好是讓應用系統連結資料庫的次數變成一次,如此一來除了主程式需要連結資料庫之外,其他的應用模組都能夠公同使用由主程式載入的資料模組的話,那麼一切問題不都解決了嗎?請注意,在這裡我所說的其他模組代表獨立的EXE或是其他形式的應用程式,而不是指在單一一個EXE之中不同的表格或是子系統。我們可以使用圖一來表示這個想法。在這個構想中,我希望由應用主程式先負責載入公用的資料模組。在這個
5、資料模組之中有其他子系統需要使用各個資料庫表格,如此一來當主程式啟動其他的子系統時,就不需要再讓每一個子系統再連結,開啟資料庫表格了。圖一 公用資料模組示意圖當這樣還有一些設計上的問題,我們稍後再回來討論這個問題,現在先我們看看如何的把這個構想實做出來,並且測試一下實際的結果是不是真的比較有效率。要實做這個構想,我們必須想辦法讓公用的資料模組能夠讓每一個子系統存取到,並且不再需要每一個子系統都分別的和資料庫建立一個連結的Session。我的第一個想法是使用DLL來解決這個問題。但是事實上使用DLL無法解決這個問題。在我花費了許多的時間
6、之後,使用DLL仍然有會有AccessViolation的錯誤。我也曾在網路上搜尋相關的問題或是資料,我在寶蘭的DiscussForum中也看到有人提出類似的問題,但是似乎都沒有人確實的回答這個問題。我也想過乾脆拿出我的Soft-Ice和Bounds-Checker看看為什麼使用DLLAssembly打交道,這實在不是件好玩的事情。正打算放棄之時,突然想到Delphi3.0之中的Package不正是解決這個問題的好方法嗎?於是我就決定試試看,果然一擊中地,順利的解決了這個問題。當然,要知道為什麼使用Package可以解決這個問題,你需
7、要知道Package和DLL的異同。DLL和Package為什麼在我一開始使用DLL時無法解決多個模組共用一個資料模組DLL的問題呢?這主要是因為在Win95/NT中當每一個模組載入DLL時,對於每一個DLL之中的全域變數而言,每一個模組都會有一份獨立的變數。這是什麼意思呢?我們可以使用圖二來說明。圖二Win95/NT中全域變數和模組的關係當圖二中的模組一和模組二分別的載入它們共用的DLL時,雖然在這個共用的DLL中有一個全域變數gAccount。但是模組一和模型二會分別的擁有一個gAccount變數。這也就是說模組一對於gAccou
8、nt變數數值所做的修改並不會影響模組二中的gAccount變數數值。在Wn95/NT中的DLL行為是和Win3.x不同的,因為在Win3.x中所有的模組都使是共用一份DLL中的全域變數。由於Win95/NT中DLL全域變
此文档下载收益归作者所有