姚曦
(福建衛(wèi)生職業(yè)技術(shù)學(xué)院,福建福州350000)
以往人們開發(fā)系統(tǒng)大都采用客戶機(jī)/服務(wù)器的兩層結(jié)構(gòu),在這種模式中,所有的形式邏輯和業(yè)務(wù)邏輯均駐留在客戶端,而服務(wù)器則成為數(shù)據(jù)庫服務(wù)器。這樣一來服務(wù)器就變得很“胖”,被稱為“胖客戶端(FatClient)”。它的弊端十分明顯:“胖”客戶端造成更新繁瑣,日常維護(hù)十分困難,一旦客戶端的程序發(fā)生改變,就必須對(duì)所有的客戶端進(jìn)行修改。并且隨著客戶端的不斷增加,對(duì)帶寬與服務(wù)器的壓力也越來越大。
M IDAS是Multi-tier Distributed Application Services Suite(多層分布式應(yīng)用程序服務(wù)包)的縮寫。三層體系結(jié)構(gòu)即客戶應(yīng)用程序(表示層),應(yīng)用程序服務(wù)器(業(yè)務(wù)層),遠(yuǎn)程數(shù)據(jù)庫服務(wù)器(數(shù)據(jù)層)。其中數(shù)據(jù)層負(fù)責(zé)存儲(chǔ)數(shù)據(jù),可以理解為數(shù)據(jù)庫服務(wù)器。業(yè)務(wù)層負(fù)責(zé)從數(shù)據(jù)庫中獲取數(shù)據(jù)并檢查其的合法性。表示層也可稱做GUI層,負(fù)責(zé)在客戶端顯示數(shù)據(jù)。
M IDAS優(yōu)點(diǎn)在于使三層結(jié)構(gòu)在邏輯上相互獨(dú)立。表示層配置在客戶機(jī)中,即在客戶端僅是一些界面設(shè)計(jì),沒有具體的應(yīng)用程序。當(dāng)要追加新業(yè)務(wù)時(shí),只需統(tǒng)一在應(yīng)用程序服務(wù)器進(jìn)行中間件的更新,而不影響其它兩層,實(shí)現(xiàn)了“瘦”客戶端,彌補(bǔ)了兩層體系結(jié)構(gòu)的不足。
本系統(tǒng)以Delphi7.0為主要的開發(fā)平臺(tái),MS SQL Server2000作為數(shù)據(jù)庫服務(wù)器,采用Delphi中的M IDAS基本的開發(fā)方法,構(gòu)建了具有三層體系結(jié)構(gòu)的圖書館信息管理系統(tǒng)。系統(tǒng)在客戶端使用基于TCP/IP協(xié)議的Delphi TsocketConnection組件連接中間件。在中間件使用多線程連接數(shù)據(jù)庫,并使用遠(yuǎn)程數(shù)據(jù)模塊(RemoteDataModle)中的Provider接收來自客戶端的Clientdataset組件的請(qǐng)求,并向數(shù)據(jù)庫查找想要的數(shù)據(jù)。而后再通過Provider向客戶端的Clientdataset組件送回?cái)?shù)據(jù)。最后數(shù)據(jù)存儲(chǔ)在由MS SQL Server2000構(gòu)建的數(shù)據(jù)服務(wù)器中。
通過調(diào)研,確定了圖書館信息管理系統(tǒng)的兩類管理模式:圖書管理員,學(xué)生。他們各自擁有權(quán)限管理及功能。圖書管理員有5個(gè)操作模塊:圖書管理、學(xué)生管理、查詢、圖書操作、報(bào)表打印。學(xué)生有2個(gè)操作模塊:圖書信息檢索、學(xué)生信息。
本多層的圖書館管理系統(tǒng)有三個(gè)功能模塊來實(shí)現(xiàn)。客戶服務(wù)器,應(yīng)用程序服務(wù)器,數(shù)據(jù)庫。他們的實(shí)現(xiàn)步驟如下:首先開發(fā)遠(yuǎn)程應(yīng)用程序服務(wù)器,他負(fù)責(zé)為客戶服務(wù)器提供數(shù)據(jù)服務(wù)。其次開發(fā)客戶服務(wù)器及客戶端界面,最后連接客戶端應(yīng)用程序和遠(yuǎn)程應(yīng)用程序服務(wù)器。
Delphi建立的遠(yuǎn)程應(yīng)用程序服務(wù)器要求是一個(gè)EXE服務(wù)器,它稱為M IDAS應(yīng)用程序服務(wù)器。通常通過以下幾個(gè)步驟來建立:1、建立應(yīng)用程序。2、建立基于TCP/IP的TremoteDataModule的遠(yuǎn)程數(shù)據(jù)模塊。3、在遠(yuǎn)程數(shù)據(jù)模塊中使用ADOQuery組件連接數(shù)據(jù)庫。4、使用TdataSetProvider組件連接遠(yuǎn)程數(shù)據(jù)模塊之中的數(shù)據(jù)集組件。5、編譯、運(yùn)行遠(yuǎn)程應(yīng)用程序服務(wù)器。
本系統(tǒng)使用TADOConnection組件連接數(shù)據(jù)庫。如果想建立多個(gè)數(shù)據(jù)源連接,則需要同時(shí)使用多個(gè)TADOConnection組件,否則只需使用一個(gè)TADOConnection組件即可。本系統(tǒng)使用connectionstring連接數(shù)據(jù)庫。連接的語句為“Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;InitialCatalog=圖書館管理系統(tǒng);Data Source=yx”其中各參數(shù)意義如下:
Provider:數(shù)據(jù)提供者。因?yàn)楸鞠到y(tǒng)數(shù)據(jù)庫為SQL,所以選擇SQLOLEDB.1。
Persist Security Info:設(shè)置為“false”時(shí),當(dāng)連接處于打開狀態(tài)時(shí),一些安全信息不會(huì)返回。
User ID:用戶登錄數(shù)據(jù)庫的ID。
Initial Catalog:數(shù)據(jù)庫的目錄名稱。
Data Source:數(shù)據(jù)庫服務(wù)器的名稱。
客戶端使用TClientDataSet通過TCP/IP與遠(yuǎn)程應(yīng)用程序服務(wù)器的TdatasetProvider進(jìn)行連接來獲取數(shù)據(jù)。使用TClientDataSet的ApplyUpdates方法來保存對(duì)數(shù)據(jù)庫的更新操作。其中TClientDataSet是個(gè)存在于內(nèi)存中的“虛擬表”,它具有緩沖的作用,因此對(duì)數(shù)據(jù)庫的操作非???。
本系統(tǒng)在客戶服務(wù)器上使用Dbgrid來顯示數(shù)據(jù),利用Dbgrid中的Dataset連接ClientDataSet,而不是直接連接到數(shù)據(jù)源。以往當(dāng)需要在客戶服務(wù)器上顯示查找的記錄時(shí),會(huì)訪問數(shù)據(jù)庫依次查詢各條記錄,直至最后一條。這就造成每次顯示數(shù)據(jù)都必須訪問數(shù)據(jù)庫,當(dāng)多客戶端或多次操作時(shí),數(shù)據(jù)庫的開銷就很大。Dbgrid的優(yōu)點(diǎn)在于可通過設(shè)置ClientDataSet中的PacketRecords選項(xiàng)可以選擇下載多少的數(shù)據(jù)至內(nèi)存,并直接在內(nèi)存中進(jìn)行查詢操作,無需每次操作都訪問數(shù)據(jù)庫,極大減少了數(shù)據(jù)庫的開銷,滿足了多客戶端的需求,提高了系統(tǒng)的負(fù)載能力。具體的操作步驟如下:
在客戶服務(wù)器中建立三個(gè)TclientDataset,在遠(yuǎn)程應(yīng)用程序服務(wù)器中建立兩個(gè)TDataSetProvider,兩個(gè)ADOQury。其中clientDataset1連接Datasetprocider1,DataSetProvider1的數(shù)據(jù)集為ADOQury1,clientDataset2連接的是Datasetprocide2,DataSetProvider2的數(shù)據(jù)集為ADOQury2,兩個(gè)ADOQury的SQL string語句都是Select*From Notebook(從圖書記錄表中選取所有的信息)。ClientDataset3沒有連接任何其它數(shù)據(jù)組件。
如果用戶要搜索以“明月”為開頭的數(shù)據(jù),那么可能會(huì)找到“明月夜”,“明月天”這些數(shù)據(jù),但如果直接把數(shù)據(jù)添加到clientDataset1中,考慮到clientDataset1也許已經(jīng)存在這些數(shù)據(jù),clientDataset1中的數(shù)據(jù)就會(huì)重復(fù)。所以必須對(duì)clientDataset1進(jìn)行檢查。如果直接在clientDataset1進(jìn)行檢查,那么clientDataset1會(huì)到數(shù)據(jù)庫下載所有的數(shù)據(jù)。因此需要一個(gè)無連接任何組件的clientDataset3。把clientDataset1中的數(shù)據(jù)指定給clientDataset3,用CheckData方法來比較兩個(gè)clientDataset的數(shù)據(jù)是否相同,如果找到相同的數(shù)據(jù)則在clientDataset2中刪除,最后把clientDataset2中的數(shù)據(jù)重新更新至clientDataset1即可。
數(shù)據(jù)的更新操作一般可以分為增加,修改和刪除。本系統(tǒng)使用TclientDataSet組件中的的Insert,Edit,Delete等方法來更新數(shù)據(jù),然后調(diào)用Post。但與兩層體系結(jié)構(gòu)不一樣的地方在于:調(diào)用Post后,實(shí)際上并沒有對(duì)數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)進(jìn)行更新,而是將更新的內(nèi)容存儲(chǔ)在客戶服務(wù)器的內(nèi)存中。最后必須調(diào)用ApplyUpdates來執(zhí)行更新操作后,才把數(shù)據(jù)真正地更新到數(shù)據(jù)庫服務(wù)器。同時(shí)還可以為ApplyUpdates設(shè)置一個(gè)數(shù)值來設(shè)置容錯(cuò)率。數(shù)值的大小代表了容錯(cuò)率的高低,并設(shè)置出現(xiàn)錯(cuò)誤時(shí)事務(wù)的處理方法來提高系統(tǒng)的安全性。
近年來,隨著計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展,對(duì)信息的需求越來越大。隨之人們對(duì)數(shù)據(jù)處理的要求也越來越高。不僅要求高負(fù)荷,也要求高可靠性和安全性。從長遠(yuǎn)看,M IDAS的數(shù)據(jù)庫結(jié)構(gòu)將會(huì)慢慢取代傳統(tǒng)的兩層數(shù)據(jù)庫結(jié)構(gòu),成為開發(fā)數(shù)據(jù)庫系統(tǒng)的關(guān)鍵技術(shù),為數(shù)據(jù)處理提高安全穩(wěn)固的保障?;谶@種想法,本文闡述了分布式數(shù)據(jù)結(jié)構(gòu)的基本結(jié)構(gòu),對(duì)其進(jìn)行了研究,分析了它的優(yōu)點(diǎn)。并在研究的基礎(chǔ)上,論述了一個(gè)基于M IDAS的圖書館信息管理系統(tǒng)。給出了需求分析和具體的實(shí)現(xiàn)方法與主要技術(shù)。
[1] W illiam Y.Arms.數(shù)字圖書館概論[M].電子工業(yè)出版社,2001.
[2] 王志梅.關(guān)系數(shù)據(jù)庫基礎(chǔ)與技術(shù)[M].國防工業(yè)出版社,2005.
[3] 董良,高磊,朱明峰,高忠濤.深入淺出Delphi6[M].清華大學(xué)出版社,2002.
[4] 李維.Delphi5.X ADO/MTS/COM+高級(jí)程序設(shè)計(jì)篇[M].機(jī)械工業(yè)出版社,2000.
[5] 李維.DELPHI5.X分布式多層應(yīng)用系統(tǒng)篇[M].械工業(yè)出版社,2000.
[6] Arco Cantu.Mastering Delphi7.oel Fugazzotto.2003.