之前有對(duì)性能需求進(jìn)行過(guò)分析,那篇主要從項(xiàng)目業(yè)務(wù)、背景等角度如何抽絲剝繭的將項(xiàng)目的需求抽離出來(lái)。在我們進(jìn)行需求的時(shí)候也需要對(duì)被測(cè)項(xiàng)目的架構(gòu)有一定的認(rèn)識(shí),如果不了解被測(cè)系統(tǒng)的架構(gòu),那么在后期的性能分析與調(diào)優(yōu)階段將無(wú)從下手。
簡(jiǎn)單系統(tǒng)架構(gòu)介紹
因?yàn)槊總€(gè)公司的業(yè)務(wù)不同,采用的技術(shù),架構(gòu)也都有很大不同。但不管怎么變動(dòng),但基本都在三層架構(gòu)的基礎(chǔ)上擴(kuò)展與改進(jìn)。
下面看一個(gè)基本的系統(tǒng)架構(gòu):

表示層:
表示層運(yùn)行在客戶終端上,運(yùn)行java applet 程序,提供協(xié)議控制和用戶界面,與系統(tǒng)用戶實(shí)現(xiàn)直接交互,通過(guò)TCP/HTTP協(xié)議與業(yè)務(wù)層系統(tǒng)通信,向應(yīng)用層系統(tǒng)發(fā)送請(qǐng)求報(bào)文,并接收應(yīng)用層系統(tǒng)返回的回應(yīng)報(bào)文。
業(yè)務(wù)邏輯層:
業(yè)務(wù)邏輯層作為中間層實(shí)現(xiàn)核心業(yè)務(wù)邏輯服務(wù)。
應(yīng)用服務(wù)器主要運(yùn)行中間件系統(tǒng),中間件系統(tǒng)系統(tǒng)作為一個(gè)容器來(lái)運(yùn)行各種應(yīng)用軟件系統(tǒng)。前臺(tái)發(fā)來(lái)的請(qǐng)求報(bào)文通過(guò)中間件傳遞給應(yīng)用程序,應(yīng)用程序在處理的過(guò)程中調(diào)用數(shù)據(jù)層的數(shù)據(jù)服務(wù)器,數(shù)據(jù)服務(wù)器將查詢的數(shù)據(jù)返回給應(yīng)用程序,應(yīng)用軟件處理完成后通過(guò)中間件系統(tǒng)返回給客戶端。
在大型的系統(tǒng)中,可以對(duì)應(yīng)用系統(tǒng)進(jìn)行拆分,比如拆分成交易服務(wù),查詢服務(wù);或者通過(guò)負(fù)載均衡技術(shù),來(lái)分散客戶端發(fā)來(lái)的請(qǐng)求,使其能承受更大的用戶訪問(wèn)量。
數(shù)據(jù)層:
數(shù)據(jù)層運(yùn)行在數(shù)據(jù)庫(kù)主機(jī)上,負(fù)責(zé)整個(gè)系統(tǒng)中數(shù)據(jù)信息的存儲(chǔ)。運(yùn)行數(shù)據(jù)庫(kù)服務(wù)程序,查詢通過(guò)JDBC與應(yīng)用程序進(jìn)行通信,主要用于存儲(chǔ)數(shù)據(jù)與提供數(shù)據(jù)查詢等服務(wù)。
數(shù)據(jù)庫(kù)集群技術(shù)就是對(duì)大型系統(tǒng)應(yīng)用非常廣泛的一種解決方案。
大型系統(tǒng)架構(gòu)介紹
前面介紹了一般系統(tǒng)的架構(gòu),那么一個(gè)大型的系統(tǒng)在設(shè)計(jì)中使用了哪些手段或技術(shù)來(lái)提高系統(tǒng)的性能呢

操作系統(tǒng)
操作系統(tǒng)是硬件與軟件之間的橋梁,那么一個(gè)穩(wěn)定的操作系統(tǒng)是系統(tǒng)堅(jiān)實(shí)的基礎(chǔ)。在個(gè)人操作系統(tǒng)領(lǐng)域,windows 無(wú)疑是絕對(duì)的霸主,但隨著近幾年的發(fā)展,linux/unix以其不俗的性能表現(xiàn),超強(qiáng)的穩(wěn)定性與安全性使其在服務(wù)器領(lǐng)域變成重多企業(yè)的首選。因?yàn)橄到y(tǒng)服務(wù)器由少數(shù)技術(shù)人員使用,他們更看重系統(tǒng)的性能、穩(wěn)定性和安全性等方面的表現(xiàn)。
Web服務(wù)器
Web服務(wù)器即中間件服務(wù)器,是應(yīng)用程序的載體(容器),應(yīng)用程序只有在中間件服務(wù)器上才能正常的運(yùn)行被外界所訪問(wèn)使用。對(duì)于window系統(tǒng)來(lái)說(shuō),IIS是微軟配套的web服務(wù)器,他們的搭配應(yīng)該是夫妻是之間的默契;apache 作為開源力量代表,不管在windows還是linux下面都非常得寵。因?yàn)?/span>linux與apache 都為開源產(chǎn)品且性能優(yōu)異,應(yīng)用非常廣泛。
· 淘寶網(wǎng)(阿里巴巴): Linux操作系統(tǒng) + Web 服務(wù)器: Apache
· 新浪:FreeBSD + Web 服務(wù)器:Apache
· Yahoo:FreeBSD + Web 服務(wù)器:自己的
· Google: 部分Linux + Web 服務(wù)器:自己的
· 百度:Linux + Web 服務(wù)器: Apache
· 網(wǎng)易:Linux + Web 服務(wù)器: Apache
· eBay: Windows Server 2003/8 (大量) + Web 服務(wù)器:Microsoft IIS
· MySpace: Windows Server 2003/8 + Web 服務(wù)器:Microsoft IIS
常用的系統(tǒng)架構(gòu)是:
· Linux + Apache + PHP + MySQL
· Linux + Apache + Java (WebSphere) + Oracle
· Windows Server 2003/2008 + IIS + C#/ASP.NET + 數(shù)據(jù)庫(kù)
· Window Server 2003/2008 + tomcat + MySql
提高系統(tǒng)性能的相關(guān)技術(shù)
網(wǎng)頁(yè)HTML 靜態(tài)化
其實(shí)大家都知道網(wǎng)頁(yè)靜態(tài)化,效率最高,消耗最小的就是純靜態(tài)化的 html 頁(yè)面,所以我們盡可能使我們的網(wǎng)站上的頁(yè)面采用靜態(tài)頁(yè)面來(lái)實(shí)現(xiàn),這個(gè)最簡(jiǎn)單的方法其實(shí)也是最有效的方法。
但是對(duì)于大量?jī)?nèi)容并且頻繁更新的網(wǎng)站,我們無(wú)法全部手動(dòng)去挨個(gè)實(shí)現(xiàn),于是出現(xiàn)了我們常見的信息發(fā)布系統(tǒng) CMS,像我們常訪問(wèn)的各個(gè)門戶站點(diǎn)的新聞?lì)l道,甚至他們的其他頻道,都是通過(guò)信息發(fā)布系統(tǒng)來(lái)管理和實(shí)現(xiàn)的,信息發(fā)布系統(tǒng)可以實(shí)現(xiàn)最簡(jiǎn)單的信息錄入自動(dòng)生成靜態(tài)頁(yè)面,還能具備頻道管理,權(quán)限管理,自動(dòng)抓取等功能,
對(duì)于一個(gè)大型網(wǎng)站來(lái)說(shuō),擁有一套高效,可管理的CMS 是必不可少的,除了門戶和信息發(fā)布類型的網(wǎng)站,對(duì)于交互性要求很高的社區(qū)類型網(wǎng)站來(lái)說(shuō),盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子,文章進(jìn)行實(shí)時(shí)的靜態(tài)化,有更新的時(shí)候再重新靜態(tài)化也是大量使用的策略,像Mop 的大雜燴就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此同時(shí),html 靜態(tài)化也是某些緩存策略使用的手段,
對(duì)于系統(tǒng)中頻繁使用數(shù)據(jù)庫(kù)查詢但是內(nèi)容更新很小的應(yīng)用,可以考慮使用 html 靜態(tài)化來(lái)實(shí)現(xiàn),比如論壇中論壇的公用設(shè)置信息,這些信息目前的主流論壇都 可以進(jìn)行后臺(tái)管理并且存儲(chǔ)再數(shù)據(jù)庫(kù)中,這些信息其實(shí)大量被前臺(tái)程序調(diào)用,但是更新頻率很小,可以 考慮將這部分內(nèi)容進(jìn)行后臺(tái)更新的時(shí)候進(jìn)行靜態(tài)化,這樣避免了大量的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求;
圖片服務(wù)器分離
對(duì)Web 服務(wù)器來(lái)說(shuō),不管是 Apache,IIS 還是其他容器,圖片是最消耗資源的,于是我們 有必要將圖片與頁(yè)面進(jìn)行分離,這是基本上大型網(wǎng)站都會(huì)采用的策略,他們都有獨(dú)立的圖片服務(wù)器,甚至很多臺(tái)圖片服務(wù)器,這樣的架構(gòu)可以降低提供頁(yè)面訪問(wèn)請(qǐng)求的服務(wù)器系統(tǒng)壓力,并且可以保證系統(tǒng)不 會(huì)因?yàn)閳D片問(wèn)題而崩潰,在應(yīng)用服務(wù)器和圖片服務(wù)器上,可以進(jìn)行不同的配置優(yōu)化,比如 apache 在配置 ContentType 的時(shí)候可以盡量少支持,盡可能少的 LoadModule,保證更高的系統(tǒng)消耗和執(zhí)行效率;
數(shù)據(jù)庫(kù)集群和庫(kù)表散列
大型網(wǎng)站都有復(fù)雜的應(yīng)用,這些應(yīng)用必須使用數(shù)據(jù)庫(kù),那么在面對(duì)大量訪問(wèn)的時(shí)候,數(shù)據(jù)庫(kù)的瓶頸很快就能顯現(xiàn)出來(lái),這時(shí)一臺(tái)數(shù)據(jù)庫(kù)將很快無(wú)法滿足應(yīng)用,于是我們需要使用數(shù)據(jù)庫(kù)集群或者庫(kù)表散列。
在數(shù)據(jù)庫(kù)集群方面, 很多數(shù)據(jù)庫(kù)都有自己的解決方案, Oracle, Sybase 等都有很好的方案,常用的 MySQL 提供的 Master/Slave 也是類似的方案,您使用了什么樣的 DB,就參考相應(yīng)的解決方案來(lái)實(shí)施即可。
上面提到的數(shù)據(jù)庫(kù)集群由于在架構(gòu),成本,擴(kuò)張性方面都會(huì)受到所采用 DB 類型的限制,于是我們需要從應(yīng)用程序的角度來(lái)考慮改善系統(tǒng)架構(gòu),庫(kù)表散列是常用并且最有效的解決方案,我們?cè)趹?yīng)用程序中安裝 業(yè)務(wù)和應(yīng)用或者功能模塊將數(shù)據(jù)庫(kù)進(jìn)行分離,不同的模塊對(duì)應(yīng)不同的數(shù)據(jù)庫(kù)或者表,再按照一定的策略 對(duì)某個(gè)頁(yè)面或者功能進(jìn)行更小的數(shù)據(jù)庫(kù)散列,比如用戶表,按照用戶 ID 進(jìn)行表散列,這樣就能夠低成本 的提升系統(tǒng)的性能并且有很好的擴(kuò)展性,sohu 的論壇就是采用了這樣的架構(gòu),將論壇的用戶,設(shè)置,帖 子等信息進(jìn)行數(shù)據(jù)庫(kù)分離,然后對(duì)帖子,用戶按照板塊和 ID 進(jìn)行散列數(shù)據(jù)庫(kù)和表,最終可以在配置文件 中進(jìn)行簡(jiǎn)單的配置便能讓系統(tǒng)隨時(shí)增加一臺(tái)低成本的數(shù)據(jù)庫(kù)進(jìn)來(lái)補(bǔ)充系統(tǒng)性能;
緩存
緩存一詞搞技術(shù)的都接觸過(guò),很多地方用到緩存,網(wǎng)站架構(gòu)和網(wǎng)站開發(fā)中的緩存也是非常重要,這里先 講述最基本的兩種緩存,高級(jí)和分布式的緩存在后面講述, 架構(gòu)方面的緩存,對(duì) Apache 比較熟悉的人都能知道 Apache 提供了自己的緩存模塊,也可以使用外加的 Squid 模塊進(jìn)行緩存,這兩種方式均可以有效的提高 Apache 的訪問(wèn)響應(yīng)能力, 網(wǎng)站程序開發(fā)方面的緩存,Linux 上提供的 Memory Cache 是常用的緩存接口,可以在 web 開發(fā)中使用, 比如用 Java 開發(fā)的時(shí)候就可以調(diào)用 MemoryCache 對(duì)一些數(shù)據(jù)進(jìn)行緩存和通訊共享, 一些大型社區(qū)使用了 這樣的架構(gòu), 另外, 在使用 web 語(yǔ)言開發(fā)的時(shí)候, 各種語(yǔ)言基本都有自己的緩存模塊和方法, PHP 有 Pear 的 Cache 模塊,Java 就更多了,net 不是很熟悉,相信也肯定有;
鏡像
鏡像是大型網(wǎng)站常采用的提高性能和數(shù)據(jù)安全性的方式,鏡像的技術(shù)可以解決不同網(wǎng)絡(luò)接入商和地域帶來(lái)的用戶訪問(wèn)速度差異, 比如 ChinaNet 和 EduNet 之間的差異就促使了很多網(wǎng)站在教育網(wǎng)內(nèi)搭建鏡像站點(diǎn),數(shù)據(jù)進(jìn)行定時(shí)更新或者實(shí)時(shí)更新,在鏡像的細(xì)節(jié)技術(shù)方面,這里不闡述太深,有很多專業(yè)的現(xiàn)成的解決 架構(gòu)和產(chǎn)品可選,也有廉價(jià)的通過(guò)軟件實(shí)現(xiàn)的思路,比如 Linux 上的 rsync 等工具;
負(fù)載均衡
負(fù)載均衡將是大型網(wǎng)站解決高負(fù)荷訪問(wèn)和大量并發(fā)請(qǐng)求采用的終極解決辦法,負(fù)載均衡技術(shù)發(fā)展了多年,有很多專業(yè)的服務(wù)提供商和產(chǎn)品可以選擇,下面介紹幾種常見的負(fù)載均衡。
1. 基于DNS的負(fù)載均衡--一個(gè)域名綁定多個(gè)IP
DNS負(fù)載均衡技術(shù)是最早的負(fù)載均衡解決方案,它是通過(guò)DNS服務(wù)中的隨機(jī)名字解析來(lái)實(shí)現(xiàn)的,在DNS服務(wù)器中,可以為多個(gè)不同的地址配置同一個(gè)名字,而最終查詢這個(gè)名字的客戶機(jī)將在解析這個(gè)名字時(shí)得到其中的一個(gè)地址。因此,對(duì)于同一個(gè)名字,不同的客戶機(jī)會(huì)得到不同的地址,它們也就訪問(wèn)不同地址上的Web 服務(wù)器,從而達(dá)到負(fù)載均衡的目的。
這種技術(shù)的優(yōu)點(diǎn)是,實(shí)現(xiàn)簡(jiǎn)單、實(shí)施容易、成本低、適用于大多數(shù)TCP/IP應(yīng)用;但是,其缺點(diǎn)也非常明顯,首先這種方案不是真正意義上的負(fù)載均衡,DNS 服務(wù)器將Http請(qǐng)求平均地分配到后臺(tái)的Web服務(wù)器上,而不考慮每個(gè)Web服務(wù)器當(dāng)前的負(fù)載情況;如果后臺(tái)的Web服務(wù)器的配置和處理能力不同,最慢的 Web服務(wù)器將成為系統(tǒng)的瓶頸,處理能力強(qiáng)的服務(wù)器不能充分發(fā)揮作用;其次未考慮容錯(cuò),如果后臺(tái)的某臺(tái)Web服務(wù)器出現(xiàn)故障,DNS服務(wù)器仍然會(huì)把DNS 請(qǐng)求分配到這臺(tái)故障服務(wù)器上,導(dǎo)致不能響應(yīng)客戶端。最后一點(diǎn)是致命的,有可能造成相當(dāng)一部分客戶不能享受Web服務(wù),并且由于DNS緩存的原因,所造成的后果要持續(xù)相當(dāng)長(zhǎng)一段時(shí)間(一般DNS的刷新周期約為24小時(shí))。所以在國(guó)外最新的建設(shè)中心Web站點(diǎn)方案中,已經(jīng)很少采用這種方案了。
2. 通過(guò)硬件四層交換實(shí)現(xiàn)負(fù)載均衡
在硬件四層交換產(chǎn)品領(lǐng)域,有一些知名的產(chǎn)品可以選擇,比如Alteon、F5等,這些產(chǎn)品很昂貴,但是物有所值,能夠提供非常優(yōu)秀的性能和很靈活的管理能力。Yahoo中國(guó)當(dāng)初接近2000臺(tái)服務(wù)器使用了三四臺(tái)Alteon就搞定了
3. 通過(guò)軟件四層交換實(shí)現(xiàn)負(fù)載均衡
軟件四層交換我們可以使用Linux上常用的LVS來(lái)解決,LVS就是Linux Virtual Server,他提供了基于心跳線heartbeat的實(shí)時(shí)災(zāi)難應(yīng)對(duì)解決方案,提高系統(tǒng)的魯棒性,同時(shí)可供了靈活的虛擬VIP配置和管理功能,可以同時(shí)滿足多種應(yīng)用需求,這對(duì)于分布式的系統(tǒng)來(lái)說(shuō)必不可少。
一個(gè)典型的使用負(fù)載均衡的策略就是,在軟件或者硬件四層交換的基礎(chǔ)上搭建squid集群,這種思路在很多大型網(wǎng)站包括搜索引擎上被采用,這樣的架構(gòu)低成本、高性能還有很強(qiáng)的擴(kuò)張性。
4. 通過(guò)反向代理服務(wù)器實(shí)現(xiàn)負(fù)載均衡
反向代理服務(wù)器又稱為 WEB 加速服務(wù)器,它位于 WEB 服務(wù)器的前端,充當(dāng)WEB服務(wù)器的內(nèi)容緩存器,反向代理服務(wù)器是針對(duì) WEB 服務(wù)器設(shè)置的,后臺(tái) WEB 服務(wù)器對(duì)互聯(lián)網(wǎng)用戶是透明的,用戶只能看到反向代理服務(wù)器的地址,不清楚后臺(tái) WEB 服務(wù)器是如何組織架構(gòu)的。當(dāng)互聯(lián)網(wǎng)用戶請(qǐng)求 WEB 服務(wù)時(shí),DNS 將請(qǐng)求的域名解析為反向代理服務(wù)器的 IP 地址,這樣 URL 請(qǐng)求將被發(fā)送到反向代理服務(wù)器,由反向代理服務(wù)器負(fù)責(zé)處理用戶的請(qǐng)求與應(yīng)答、與后臺(tái) WEB 服務(wù)器交互。利用反向代理服務(wù)器減輕了后臺(tái) WEB 服務(wù)器的負(fù)載,提高了訪問(wèn)速度,同時(shí)避免了因用戶直接與 WEB 服務(wù)器通信帶來(lái)的安全隱患。
-------------------------------------
這篇文章非常糾結(jié),以目前技術(shù)水平來(lái)講這塊的東西實(shí)屬班門弄斧。部分內(nèi)容從互聯(lián)網(wǎng)搜集。
各種系統(tǒng)架構(gòu)圖及其簡(jiǎn)介
1.Spring 架構(gòu)圖
Spring 是一個(gè)開源 框架,是為了解決企業(yè) 應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢(shì)之一就是其分層架構(gòu),分層架構(gòu)允許您選擇使用哪一個(gè)組件,同時(shí)為J2EE 應(yīng)用程序開發(fā)提供集成的框架。Spring 框架的功能可以用在任何J2EE 服務(wù)器中,大多數(shù)功能也適用于不受管理 的環(huán)境。Spring的核心要點(diǎn)是:支持不綁定到特定J2EE 服務(wù)的可重用業(yè)務(wù)和數(shù)據(jù)訪問(wèn)對(duì)象。這樣的對(duì)象可以在不同J2EE 環(huán)境(Web 或EJB )、獨(dú)立應(yīng)用程序、測(cè)試 環(huán)境之間重用。

組成Spring 框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。每個(gè)模塊的功能如下:
- 核心容器:核心容器提供Spring 框架的基本功能。核心容器的主要組件是BeanFactory ,它是工廠模式的實(shí)現(xiàn)。BeanFactory 使用控制反轉(zhuǎn) (IOC ) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼 分開。
- Spring 上下文:Spring 上下文是一個(gè)配置文件,向Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù),例如JNDI 、EJB 、電子郵件、國(guó)際化、校驗(yàn)和調(diào)度功能。
- Spring AOP : 通過(guò)配置管理特性,Spring AOP 模塊直接將面向方面的編程 功能集成到了Spring 框架中。所以,可以很容易地使Spring 框架管理的任何對(duì)象支持AOP 。Spring AOP 模塊為基于Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過(guò)使用Spring AOP ,不用依賴EJB組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。
- Spring DAO :JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來(lái)管理異常處理和不同數(shù)據(jù)庫(kù) 供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理,并且極大地降低了需要編寫 的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO 的面向JDBC 的異常遵從通用的DAO 異常層次結(jié)構(gòu)。
- Spring ORM :Spring 框架插入了若干個(gè)ORM 框架,從而提供了ORM 的對(duì)象關(guān)系工具,其中包括JDO 、Hibernate 和iBatis SQL Map 。所有這些都遵從Spring 的通用事務(wù)和DAO 異常層次結(jié)構(gòu)。
2.ibatis 架構(gòu)圖
ibatis 是一個(gè)基于 Java 的持久層框架。 iBATIS 提供的持久層框架包括 SQL Maps 和 Data Access Objects ( DAO ),同時(shí)還提供一個(gè)利用這個(gè)框架開發(fā)的 JPetStore 實(shí)例。

IBATIS :最大的優(yōu)點(diǎn)是可以有效的控制sql 發(fā)送的數(shù)目,提高數(shù)據(jù)層的執(zhí)行效率!它需要程序員自己去寫sql 語(yǔ)句,不象hibernate 那樣是完全面向?qū)ο蟮模詣?dòng)化的,ibatis 是半自動(dòng)化的,通過(guò)表和對(duì)象的映射以及手工書寫的sql 語(yǔ)句,能夠?qū)崿F(xiàn)比hibernate 等更高的查詢效率。
Ibatis 只是封裝了數(shù)據(jù)訪問(wèn)層,替我們做了部分的對(duì)象關(guān)系映射。但代價(jià)是必須要寫xml 配置文件,相對(duì)于Hibernate 還要寫很多sql 。Hibernate通過(guò)工具直接從數(shù)據(jù)庫(kù)模式生成實(shí)體類和基本的配置文件,而且大部分情況下不需要我們寫sql ,會(huì)較大的提升開發(fā)效率。但這些也有很多的局限性,尤其是對(duì)環(huán)境的要求較高(數(shù)據(jù)庫(kù)設(shè)計(jì),對(duì)象設(shè)計(jì),團(tuán)隊(duì)的協(xié)作等)。 個(gè)人感覺(jué)Ibatis 對(duì)項(xiàng)目比較有意義的地方在于它小巧靈活,可擴(kuò)展,封裝了數(shù)據(jù)訪問(wèn)層(事務(wù),緩存,異常,日志),并提供了DAO 框架支持。
利用Ibatis 我們可以做到代碼和sql 的分離,只要sql 能夠解決的問(wèn)題,Ibatis 就能幫我們較容易的解決,同時(shí)也使我們的項(xiàng)目對(duì)某一框架的依賴性變?。ㄒ?yàn)镮batis 是非侵入性的)。這將極大的降低項(xiàng)目風(fēng)險(xiǎn),減少解決復(fù)雜問(wèn)題的時(shí)間,使項(xiàng)目的維護(hù)變得簡(jiǎn)單。
Ibatis 對(duì)于應(yīng)用的修改,調(diào)試,擴(kuò)充和維護(hù)將會(huì)變得容易自然。修改時(shí),我們主要修改的是代表模型的實(shí)體對(duì)象,xml 配置文件中的sql ,和/ 或配置文件的ResultMap (很多時(shí)候是不需要的)。同時(shí),sql 和代碼分離,我們不用在代碼的StringBuffer 的append 方法之間尋找需要修改的sql 。配置文件中的sql 便利了我們的調(diào)試和對(duì)sql 的評(píng)審及以后的sql 重用。
3.structs1 架構(gòu)圖
Struts 是Apache 基金會(huì)Jakarta 項(xiàng)目組的一個(gè)Open Source 項(xiàng)目,它采用MVC 模式,能夠很好地幫助java 開發(fā)者利用J2EE 開發(fā)Web 應(yīng)用。和其他的java 架構(gòu)一樣,Struts 也是面向?qū)ο笤O(shè)計(jì),將MVC 模式" 分離顯示邏輯和業(yè)務(wù)邏輯" 的能力發(fā)揮得淋漓盡致。Structs 框架的核心是一個(gè)彈性的控制層,基于如Java Servlets ,JavaBeans ,ResourceBundles 與XML 等標(biāo)準(zhǔn)技術(shù) ,以及Jakarta Commons 的一些類庫(kù)。Struts 有一組相互協(xié)作的類(組件)、Serlvet 以及jsp tag lib 組成。基于struts 構(gòu)架的web 應(yīng)用程序基本上符合JSP Model2 的設(shè)計(jì)標(biāo)準(zhǔn),可以說(shuō)是一個(gè)傳統(tǒng)MVC 設(shè)計(jì)模式的一種變化類型?! ?/p>
Struts 有其自己的控制器(Controller ),同時(shí)整合了其他的一些技術(shù)去實(shí)現(xiàn)模型層(Model )和視圖層(View )。在模型層,Struts 可以很容易的與數(shù)據(jù)訪問(wèn)技術(shù)相結(jié)合,如JDBC / EJB ,以及其它第三方類庫(kù),如Hibernate / iBATIS ,或者Object Relational Bridge( 對(duì)象關(guān)系橋) 。在視圖層,Struts 能夠與JSP ,包括JSTL 與JSF ,以及Velocity 模板,XSLT 與其它表示層技術(shù)。
Struts 為每個(gè)專業(yè)的Web 應(yīng)用程序做背后的支撐,幫助為你的應(yīng)用創(chuàng)建一個(gè)擴(kuò)展的開發(fā)環(huán)境。

? Client browser (客戶瀏覽器)
來(lái)自客戶瀏覽器的每個(gè)HTTP 請(qǐng)求創(chuàng)建一個(gè)事件。Web 容器將用一個(gè)HTTP 響應(yīng)作出響應(yīng)。
? Controller (控制器)
控制器接收來(lái)自瀏覽器的請(qǐng)求,并決定將這個(gè)請(qǐng)求發(fā)往何處。就Struts 而言,控制器是以servlet 實(shí)現(xiàn)的一個(gè)命令設(shè)計(jì)模式。struts-config.xml 文件配置控制器。
? 業(yè)務(wù)邏輯
業(yè)務(wù)邏輯更新模型的狀態(tài),并幫助控制應(yīng)用程序的流程。就Struts 而言,這是通過(guò)作為實(shí)際業(yè)務(wù)邏輯“ 瘦” 包裝的Action 類完成的。
? Model (模型)的狀態(tài)
模型表示應(yīng)用程序的狀態(tài)。業(yè)務(wù)對(duì)象更新應(yīng)用程序的狀態(tài)。ActionForm. bean 在會(huì)話級(jí)或請(qǐng)求級(jí)表示模型的狀態(tài),而不是在持久級(jí)。JSP 文件使用JSP 標(biāo)記讀取來(lái)自ActionForm. bean 的信息。
? View (視圖)
視圖就是一個(gè)JSP 文件。其中沒(méi)有流程邏輯,沒(méi)有業(yè)務(wù)邏輯,也沒(méi)有模型信息-- 只有標(biāo)記。標(biāo)記是使Struts 有別于其他框架(如Velocity )的因素之一
4.structs2 架構(gòu)圖
Struts 2 相對(duì)于Struts 1.X ,將實(shí)現(xiàn)用戶業(yè)務(wù)邏輯(Action )同Servlet API 分離開,這種分離機(jī)制,是采用了攔截器或者攔截器棧(攔截器鏈)。攔截器是Struts 2 的核心內(nèi)容之一。
Struts 2 內(nèi)建了多個(gè)攔截器和攔截器棧(由多個(gè)攔截器形成的攔截器鏈),將用戶的Web 請(qǐng)求進(jìn)行攔截處理,從而提供了更加豐富的功能,例如數(shù)據(jù)類型轉(zhuǎn)換、國(guó)際化、文件上傳等。<!-- [if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:362.25pt;height:336.75pt'><v:imagedata src="file:///C:/Users/bq_wang/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png" o:title=""/></v:shape><![endif]--><!-- [if !vml]--> 
5.Hibernate 架構(gòu)圖
Hibernate 是一個(gè)開放源代碼 的對(duì)象關(guān)系映射框架,它對(duì)JDBC 進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java 程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。Hibernate 可以應(yīng)用在任何使用JDBC 的場(chǎng)合,既可以在Java 的客戶端程序使用,也可以在Servlet/JSP 的Web 應(yīng)用中使用,最具革命 意義的是,Hibernate 可以在應(yīng)用EJB 的J2EE 架構(gòu)中取代CMP ,完成數(shù)據(jù)持久化的重任。
Hibernate 的核心接口一共有5 個(gè),分別為:Session 、SessionFactory 、Transaction 、Query 和Configuration 。這5 個(gè)核心接口在任何開發(fā)中都會(huì)用到。通過(guò)這些接口,不僅可以對(duì)持久化對(duì)象進(jìn)行存取,還能夠進(jìn)行事務(wù)控制。下面對(duì)這五個(gè)核心接口分別加以介紹。
·Session 接口:Session 接口負(fù)責(zé)執(zhí)行被持久化對(duì)象的CRUD 操作(CRUD 的任務(wù)是完成與數(shù)據(jù)庫(kù)的交流,包含了很多常見的SQL 語(yǔ)句。) 。但需要注意的是Session 對(duì)象是非線程安全的。同時(shí),Hibernate 的session 不同于JSP 應(yīng)用中的HttpSession 。這里當(dāng)使用session 這個(gè)術(shù)語(yǔ)時(shí),其實(shí)指的是Hibernate 中的session ,而 以后會(huì)將HttpSesion 對(duì)象稱為用戶session 。
·SessionFactory 接口:SessionFactory 接口負(fù)責(zé)初 始化Hibernate 。它充當(dāng)數(shù)據(jù)存儲(chǔ)源的代理,并負(fù)責(zé)創(chuàng)建Session 對(duì)象。這里用到了工廠模式。需要注意的是SessionFactory 并不是輕量級(jí)的,因?yàn)橐话闱闆r下,一個(gè)項(xiàng)目通常只需要一個(gè)SessionFactory 就夠,當(dāng)需要操作多個(gè)數(shù)據(jù)庫(kù)時(shí),可以為每個(gè)數(shù)據(jù)庫(kù)指定一個(gè)SessionFactory 。
·Configuration 接口:Configuration 接口負(fù)責(zé)配置并啟動(dòng)Hibernate ,創(chuàng)建SessionFactory 對(duì)象。在Hibernate 的啟動(dòng)的過(guò)程中,Configuration 類的實(shí)例首先定位映射文檔位置、讀取配置,然后創(chuàng)建SessionFactory 對(duì)象。
·Transaction 接口:Transaction 接口負(fù)責(zé)事務(wù)相關(guān)的操作。它是可選的,開發(fā)人員也可以設(shè)計(jì)編寫自己的底層事務(wù)處理代碼。
·Query 和Criteria 接口:Query 和Criteria 接口負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫(kù)查詢。它可以使用HQL 語(yǔ)言或SQL 語(yǔ)句兩種表達(dá)方式。
6.J2EE 架構(gòu)圖
J2EE 是一套全然不同于傳統(tǒng)應(yīng)用開發(fā)的技術(shù)架構(gòu),包含許多組件,主要可簡(jiǎn)化且規(guī)范應(yīng)用系統(tǒng)的開發(fā)與部署,進(jìn)而提高可移植性、安全與再用價(jià)值。
J2EE 核心是一組技術(shù)規(guī)范與指南,其中所包含的各類組件、服務(wù)架構(gòu)及技術(shù)層次,均有共通的標(biāo)準(zhǔn)及規(guī)格,讓各種依循J2EE 架構(gòu)的不同平臺(tái)之間,存在良好的兼容性,解決過(guò)去企業(yè)后端使用的信息產(chǎn)品彼此之間無(wú)法兼容,導(dǎo)致企業(yè)內(nèi)部或外部難以互通的窘境。
7.Oracle 架構(gòu)圖