摘要:隨著軟件設計技術的發展,一般的企業應用已經從傳統的C/S模式演變為分布式多層模式,分層模式可以最大限度地提高軟件系統的性能及可維護程度。不久前,我們承擔了一個醫院管理系統的設計和開發,醫院希望以此來轉變醫院現有的運行機制,提高服務質量,實現全院醫用信息的整合。該系統除了目前常見的結費系統、電子病歷外,還包括門診醫生模塊、住院醫生模塊、護士模塊等分支系統。所有模塊需要通過 Intranet 實現集成互聯,并有部分的 Internet 功能,本項目平臺最后采用了微軟的Dot NET平臺,并采用三層的結構體系。正確的體系劃分及軟件技術的合理選用使該系統取得了成功。
關鍵詞:分布式系統;三層體系;四層體系
隨著軟件設計技術的飛速發展,傳統的C/S模式系統已經不能適合大型開放式系統的開發需求。在傳統C/S模式的應用系統中,系統的業務處理邏輯層和表示層集成在客戶端,與數據層所在的數據庫服務器形成了胖客戶端,瘦服務器的結構。在這種結構下,客戶端顯得極為臃腫,從而導致客戶端程序在編寫及升級維護時極為麻煩。另外傳統的客戶端程序界面單調、刻板,也不能適應互聯網飛速發展情況下的使用需求。
在這種情況下,為了解決C/S模式的諸多缺陷,產生了B/S模式、分布式系統等多種體系結構。這些體系在很大程度上解決了傳統C/S模式的不足。特別是當微軟的Dot NET和SUN的J2EE平臺推出以后,分布式的三層或四層結構體系已逐漸成為一種規范,在三層結構中,系統分為表示層,業務邏輯層和數據庫層,客戶端作為表示層只是一個顯示的終端,業務邏輯層和數據庫層分別由專用服務器擔任。在這種模式下,客戶端的負重量大大減輕,而業務邏輯層則專門處理系統的業務邏輯部分,同時負責客戶端與數據庫的連接,這樣就大大減輕了服務器端的負荷。因此,B/S模式的系統在整體分布上更加合理,更加有益于系統開發和維護升級。在現有的技術中,要實現B/S模式的系統,我們可以有兩種選擇,一種是微軟的Dot NET平臺,另外一種是SUN的J2EE。相比而言,微軟的Dot NET因為在操作系統上的優勢,可用性和易用性比較好,而J2EE則是采用JAVA規范,具有平臺無關性的特點,適用于不同的平臺。
下面結合一個醫院管理系統的建設,討論一下多層分布式系統在具體實踐中的運用。
2004年,我們承擔了一個醫院管理綜合系統的設計和開發,醫院希望以此來轉變現有的運行機制,提高服務質量和工作效率。該醫院是一個礦區醫院,醫院很早就開始從事信息化管理,但主要是結費這一塊,同時,還有人事管理,藥品管理等幾個分支模塊。以上幾個模塊彼此之間沒有明顯的聯系,分屬于幾個不同的部門,彼此間信息流通量也不大。后來,院方對其進行了改進,加入對病人電子病歷的管理和采集,這樣當病人二次就診時,可以很容易地得到病人的既往病史。但隨著系統的運行,院方希望對現有系統進行改進,為了更好的為病人服務,醫院考慮加入一些其它的分支系統,比如門診醫生工作站、住院醫生工作站和護士工作站等等,并希望以此形成全院范圍內一個集成的信息系統,以使各種醫用信息能夠全面流通,給全院的各層人員提供及時準確的信息,以提高工作效率。
在開發前期,我們首先要設計出詳細的系統功能規范,這一部分所花費的時間很少,因為衛生部在 2002 年曾經頒發了一個有關醫院管理系統功能規范的通知,我們參考了該規范,很快確定了各分系統以及每個分系統的基本功能,但在選擇合適的系統平臺上有一番討論,考慮到醫院原有系統在某些地方運行良好,是否有必要將原有系統淘汰重新設計,另外新的分系統到底采用何種平臺結構也是需要考慮的問題。
醫院原有的結費系統和電子病歷系統數據流向范圍比較固定,主要集中在交費處和掛號處,一旦引入了新的系統,必然要將數據流向醫院的各個部門。醫院的 Intranet已經實施,因此首先考慮采用 B/S架構體系,舊系統的數據模型盡可能保留。在系統的軟件平臺上,我們選用了Dot NET平臺,因為我們以前的開發都是基于Windows平臺的,在新的Dot NET平臺中,提供了C++,Basic,C#幾種語言,采用Dot NET平臺,對于習慣于Windows編程的人員來說,相對易于上手,可以最大限度地縮小人員的培訓時間,節省經費,同時在技術上也有很穩固的基礎,降低了系統開發失敗的風險。確定所采用的架構和技術后,我們在系統的開發中引用了中間件技術(Middleware)。中間件是位于操作系統與應用程序之間的一類軟件,其主要功能是在分布式應用中,在應用程序及服務器之間提供通信服務并屏蔽了底層操作系統的復雜性,以減化系統的設計和維護工作,使設計者能專注于與應用邏輯層有關的部分。目前的中間件技術主要有CORBA,J2EE,JVM,CLR等,在DOT NET框架中,其底層即是CLR(通用語言運行時),CLR屏蔽了底層的復雜性,無論是用C#、Basic,還是C++編寫的代碼,最終都被翻譯成IL(中間代碼)來執行,同時,Dot NET Framework中強大的類庫也給我們的系統開發提供了便捷。
在項目建設中,我們這樣設計架構系統,將系統分為三層:
(1)表示層采用ASP.NET 實現頁面輸出。這也是用戶直接訪問層,表示層接受來自網絡瀏覽器的 HTTP 請求,然后返回給客戶端瀏覽器可以顯示的 HTML 頁面。
(2)中間件層(業務邏輯層)用C# 實現業務邏輯和對數據庫的訪問,考慮到數據的分布特點,我們使用了數據庫連接池技術。
(3)數據庫層用 SQL Server 實現數據庫的管理和存儲過程,同時使用了負載均衡技術以提高系統性能。
我們大量的工作主要放在中間件層,由于系統中的醫生工作站分系統是主要部分,因此數據庫的負載成為一個不得不考慮的問題。我們決定采用數據連接池技術,因為基本上每個醫生都對應一個客戶終端,無論是病人資料的查詢或錄入,或者醫囑的處理,都涉及到對數據庫的頻繁讀寫,服務器對于數據連接的頻繁打開和關閉必然導致性能下降。一方面,我們預先考慮數據庫的連接量,在系統初始階段建立相應的存儲空間,當數據庫連接打開和關閉時都對該連接池進行處理;另一面,我們也使用了高速緩存技術,對某些固定的SQL 查詢結果,例如藥品查詢、藥性禁忌等,將結果采用緩存存儲,以加快對數據庫的訪問,降低了服務器端的負載,提高性能。值得一提的是,為了盡可能地避免糾紛,醫院要求采用醫生簽名制度,我們設計了電子簽名,采用加密算法保證各環節產生數據的有關人員不能抵賴。數據庫層我們選擇了 SQL Server,針對該院原來系統中大量使用的Access和Foxpro數據庫,我們在此次系統重建中針對實際情況統一使用了SQL Server數據庫,同時在數據庫內容的設計上盡量做到按醫院的業務進行組織(如醫生庫,藥品庫,病人庫,收費庫等),為以后關系型的數據庫升級成為數據倉庫奠定了基礎。
在數據庫的設計中,我們到醫院做了大量的走訪工作,了解整個數據流,同時廣泛參考現有的系統。雖然對醫院行業不是很熟悉,但數據層開發遇到的問題并不是很大。在概要設計階段,我們使用了一些計算機輔助開發工具,這也加快了詳細設計的進程。比如使用了 Sybase 的 Power Designer工具,在概要設計中規劃了 E-R 圖和各個分系統以及分系統之間的數據流圖,然后讓工具直接生成后臺數據庫中的基本表結構,大大提高了開發效率。
在系統的物理實現上,我們在醫院中心機房配置了一臺SQL SERVER 2000服務器,一臺應用服務器,一臺WEB服務器。系統的醫生工作站模塊、病人電子病歷查詢模塊、藥品查詢模塊均采用WEB界面,通過應用服務器與數據庫進行通信。而結費,藥品管理等幾個模塊的細節處理則由C#開發,放在應用服務器上。這樣的處理使得整個系統的功能分布合理而高效,客戶端的Web界面簡潔而符合人們的使用習慣,服務器端功能的分解也使其負荷大大減輕。整個系統投入運行后一直運行正常,沒有出現過大的故障,系統的建設取得了成功。
在醫院管理系統的建設中,由于我們積極采用新技術,合理劃分系統的功能結構,使得系統的設計與實現能夠按預期進度正常完成,同時也為以后系統的維護奠定了良好的基礎。綜上所述,在互聯網飛速發展的今天,企業的分布式計算體系采用多層結構,在Dot NET和J2EE兩種技術之間進行合理選擇,將是系統成功及高效運轉的根本保障。
參考文獻:
[1] 張友生,徐峰.系統分析師技術指南.北京:清華大學出版社,2004.
[2] 李建忠.MICROSOFT.NET框架程序設計.北京:清華大學出版社,2003.