摘要:目前國內OJ系統大多是基于B/S的,該文分析比較了傳統的J2EE構架方式與先進的SSH三層構架方式的技術差別,從多個角度上分析了SSH三層構架的優越性,以及此構架方式運用于OJ系統所帶來的高開發性,高維護性和高拓展性等優點。基于此方案構架的中南大學ACM在線評判系統的運行結果表明,以SSH架構的新型OJ系統與傳統架構方式設計的OJ系統比較,突破了響應速度慢,維護效率低和承壓量低等幾大瓶頸問題。
關鍵詞:SSH三層架構;OJ系統;Struts;Spring;Hibernate;Ajax
中圖分類號:TP391文獻標識碼:A文章編號:1009-3044(2008)26-1698-04
Research and Design of the OJ System Based on SSH Three-tier Framework
YU La-sheng, REN Ju
(School of Information Science and Engineering,Central South University,Changsha 410083,China)
Abstract: Most of the current domestic OJ system is based on B / S, this passage analyzed and compared the traditional ways and advanced J2EE framework of the SSH three-tier framework of the technical differences in approach, from various angles on the three-tier framework of the superiority of SSH, and this OJ framework approach applied to the system brought about by the development of high, high maintenance and expansion of high advantages. Based on this framework programme of the Central South University ACM online evaluation results show that the operating system, SSH structure of the new OJ system and the traditional structure of the OJ system design approach, a breakthrough in response to slow, low efficiency and maintenance of low pressure in several major Bottlenecks.
Key words: SSH three-tier framework; OJ system; Struts; Spring;Hibernate; Ajax
1 引言
OJ(Onilne Judge)系統,是當前國內外為適應高速發展的信息科學技術,極力推廣的一種在線練習和考試系統。系統應當具有權限控制,提供練習與考試,審核提交答案,統計考核結果等功能。在ACM事業于中國發展的十幾年中,OJ系統的出現更有如雨后春筍,各大高校紛紛建立起自己的ACM網站。但由于這些起步較早的OJ系統,架構陳舊,技術更新較慢,十幾年高速發展的ACM人群和在線體驗群體開始對其承壓量、響應速度等提出了新的挑戰。傳統的servlet+javabean技術已很難適應這種需求,我們必須采用新型的網站架構技術,有效得緩解當前高速發展的信息群體所帶來的壓力與負擔。SSH(Struts+Spring+ Hibernate)主流架構技術首當其沖。
2 傳統架構與SSH三層架構的對比分析
傳統的J2EE架構方式采用純Servlet+JavaBean或Jsp+Servlet+JavaBean。國內一批優秀的ACM網站都是由這種架構方式架構而成,如POJ等。
在純Servlet+JavaBean架構年代,其業務代碼,邏輯代碼與業務展示代碼均無可避免的在同一servlet中出現,此種架構直接導致代碼結構混亂,其維護代價高,可拓展性差等缺點展露無疑。
JSP技術得出現一定程度上彌補了Servlet的尷尬局面,使得傳統得架構開始走向MVC三層架構模式。我們熟知的MVC架構模型應如圖1所示:
傳統的架構技術表現層用Jsp+Servlet技術來處理,業務層使用JavaBean,訪問層是JavaBean(即常說的Dao),與資源層的連接采用JDBC控制。此種構架方式帶來的弊端有代碼編寫量大,開發效率低,JDBC連接的安全性沒有得到保證,業務代碼無法高程度脫離,資源管理需手動編寫代碼控制等等。
SSH三層架構的出現,極大程度上解決了傳統架構所帶來的問題。其架構模型與傳統J2EE架構相似,關鍵差別在于各層內部如何實現。SSH三層架構體系中,表現層使用了Struts框架,實現了視圖控制分離。Struts的優點主要集中體現在兩個方面:Taglib和頁面導航。Taglib是Struts的標記庫,靈活動用,能大大提高開發效率。關于頁面導航,將是今后的一個發展方向,事實上,這樣做,使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對于后期的維護有著莫大的好處。
業務層使用了Spring框架。Spring是一個業務層框架,一個整合的框架,能夠很好地黏合表示層與持久層。而Spring作用于業務層的主要原因是,Service層需要處理業務邏輯和交叉業務邏輯,處理事務,日志,安全等,而這些與Spring的IoC,AOP等不謀而合,完美得實現了業務代碼的高效分離。
Hibernate是JDBC的輕量級的對象封裝,它是一個獨立的對象持久層框架。Hibernate的強大緩存機制能一定程度上的緩解服務器端頻繁讀取數據庫的壓力,這也是Hibernate被廣泛使用得重要原因之一。而且Hibernate高效的權衡了運行效率、內存消耗和開發效率,并自動封裝了事務控制,安全性代碼等重要功能。
因此,SSH的三層架構無論從性能還是編碼風格上都優于傳統架構方式。
3 基于SSH三層架構的OJ系統設計與關鍵技術
3.1 系統需求分析和國內現狀
中南大學近幾年ACM事業剛剛起步,一個良好的ACM平臺缺之不可。為避免踏上國內原有OJ系統的老路,系統設計采用了SSH三層架構體系。
ACM在線評判系統的需求主要有以下幾個方面:
用戶權限控制——包括用戶身份驗證以及提交解答前的用戶登錄狀態判斷等;
及時信息反饋——用戶提交解答后即時告知用戶其解答的正確性;
練習考試信息添加——管理員能隨時添加練習和安排考試;
統計用戶練習測試信息——系統能自動統計用戶練習與測試的排名信息,供用戶端和管理員端參考。
當前國內的OJ系統,以POJ,ZOJ等知名平臺居首,其容壓量和響應速度均已到達一個峰值。POJ的系統現已難支撐其廣大的注冊用戶。新型的架構平臺在此種情況下呼之欲出。
3.2 系統設計原則
以之前論述的傳統架構方式與SSH三層架構的比較,結合現階段J2EE領域的主流技術,新型架構的中南大學ACM在線評判系統依照以下設計原則進行設計:
1)響應速度快——SSH三層架構的數據庫持久層采用了Hibernate框架,用其強大的緩存機制,使客戶端不用每一次請求都與數據庫交互,大大降低了服務器端時間和空間上的消耗,以加快響應速度。
2)承壓量增加——在硬件設備和網絡連接設備一定的情況下,采用高性能數據庫連接池與Hibernate框架結合起來,有效的緩解并發連接高峰期的連接數壓力。
3)業務拓展性高——采用的三層架構方式將表現層、業務層和數據庫持久層分離開來,Spring對業務層的管理,使業務拓展更加方便。
4)開發效率高——以SSH三層架構搭建的靈活性,節省編碼人員大量編寫重復代碼的時間。而且架構應可其高分離性,在編碼階段實行分工編寫模塊,整合期達到零代價整合。
5)可維護性高——系統層次必須分明,以方便程序員對不同層面的代碼維護不會對其他層面的代碼造成太大影響。
6)代碼重用性高——使用struts框架將view層獨立出來,使頁面代碼具有高重用性。Spring層對業務代碼的管理,使得業務層能專注于業務邏輯,使業務層也具有高重用性。
3.3 系統架構設計
依照新型架構系統的設計原則,將SSH架構搭建好之后的架構模型圖應如圖2所示:
在SSH三層架構的系統中,對象的調用流程是:jsp-> Action-> Service ->DAO ->Hibernate。 數據的流向是 ActionFormBean接受用戶的數據,Action將數據從ActionFromBean中取出,封裝成VO或PO, 再調用業務層的Bean類,完成各種業務處理后再forward。而業務層Bean收到這個PO對象之后,會調用DAO接口方法,進行持久化操作。
3.4 架構中引入的關鍵技術
為了使中南大學ACM在線評判系統達到其最優性能,單從架構上入手是不夠的。在搭建好三層框架之后,引入了一些三層架構必備的J2EE主流技術和判定技術。并將這些關鍵技術融合于各層框架之中,使系統更具有完整性和統一性。
3.4.1 內核判定技術
OJ系統的核心處理程序在于如何驗證用戶提交答案的正確性。在此處我們的設計思想是,將用戶提交答案的驗證封裝成一個判定類供業務層調用,每當業務層需要對用戶的提交代碼進行驗證時都調用此類中的方法來進行處理。
而在判定類的內部運用了多線程機制,即為每一個提交驗證用戶開辟一個線程進行處理。判定類中的判定方法應針對用戶提交的語言不同去調用不同的底層編譯器進行處理。這里應運用到JAVA程序調用外部程序方法。其判定的主要算法為:
public boolean Compile(String text) {
try {
FileOutputStream out = new FileOutputStream(file); out.write(text.getBytes());
try {
FileInputStream input = new FileInputStream(file);
solution.setCodelength(Double.valueOf(input.available()));
input.close();
} catch (Exception e) {
e.printStackTrace();
}
String comstr = this.complie + \" \" + workpath + \"main\" + \" \"
+ file.getAbsolutePath() + \"\\";// C++編譯器指令
String cmd = RunUntil.ComShell;
Runtime runtime = Runtime.getRuntime(); // 開辟進程,運行編譯器
Process process = runtime.exec(cmd);
OutputStream output = process.getOutputStream();// 獲取進程輸出流
output.write(comstr.getBytes());
BufferedReader buff = new BufferedReader(new InputStreamReader(process.getErrorStream()));// 獲取編譯后的錯誤信息
for (long l = System.currentTimeMillis(); l + 10000 > System.currentTimeMillis() (error = buff.readLine()) != 1;) {
result += error + \"\\";
}
try {
process.waitFor();
process.destroy();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!result.equals(\"\")) {// 生成.exe文件,輸出錯誤信息
solution.setErrorcode(Format.formatErrorCode(result,workpath+ \"main.c:\"));
solution.setResult(\"Compile Error\");
return 1;
} else {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return 1;
}
3.4.2 Ajax技術
此技術廣泛應用在中南大學的ACM評判系統中,實現了客戶端與服務器端的異步通信。運用此技術同步了在線測試時客戶端與服務器端的時間進度,并將一部分操作代價轉移到了客戶端進行,減輕了服務器端的壓力,增加了系統的承壓量。在設計中,將Ajax配置寫在各界面對應的js文件中,其創建連接的代碼為:
function createXMLHttpRequest() {
if (window.XMLHttpRequest) { //Mozilla 瀏覽器
XMLHttpReq = new XMLHttpRequest();
} else {
if (window.ActiveXObject) { // IE瀏覽器
try {
XMLHttpReq = new ActiveXObject(\"Msxml2.XMLHTTP\");
}
catch (e) {
try {
XMLHttpReq = new ActiveXObject(\"Microsoft.XMLHTTP\");
}
catch (e) {
}}}}
}
3.4.3 數據庫連接池技術
數據庫連接池采用hibernate兼容的proxool,最大并發連接數設置為300,以供應小于300人同時的提交連接。Proxool數據庫連接池部署在數據庫持久層,與hibernate一起管理著系統與資源層的連接。在hibernate框架中加入proxool數據庫連接池,需要在hibernate配置文件中添加以下配置信息:
3.4.4 線程安全控制技術
在用戶提交代碼進行審核的過程中,內核編譯是一個多線程機制,而底層編譯器一次只能單獨處理一個提交事務,若同時有多個用戶產生提交請求,便容易引起競爭共享資源,導致數據出錯。因此在用戶提交代碼處理業務處應使用java同步機制,即在業務層處理用戶提交信息業務外部加上synchronized關鍵字。在代碼中的實現方法為:
try {
synchronized (m) {
…………….; //此處為提交業務處理的詳細代碼
}
}catch(Exception e){
e.printStackTrace();
}
4 系統實現成果
中南大學ACM在線評判系統已上線將近一年,在這近一年的時間里,系統從各個方面體現了新型架構帶來得穩定性和健壯性。通過對比傳統架構的OJ系統與中南大學ACM在線評判系統,在同等硬件條件下,可得出數據統計如表1所示:
5 結論
從上文兩種架構方式的技術比較,及兩種架構方式所設計的OJ系統性能對比來看,以SSH三層架構所搭建的新型OJ系統,在原OJ系統的承壓量、響應速度和維護效率等幾大瓶頸上都有了一定程度的突破。中南大學ACM實際案例證明,SSH三層架構的OJ系統較傳統J2EE架構優勢明顯,勢必將成為當今OJ系統設計的主流。
參考文獻:
[1] 庫尼亞瓦姆.深入淺出Struts[M].北京:人民郵電出版社,2007.
[2] 巴姆巴拉.J2EE技術內幕[M].北京:機械工業出版社,2007.
[3] 沃爾斯,布雷登巴赫.Spring In Action[M].北京:人民郵電出版社,2007.
[4] Sangeetha,Kumar.深入淺出J2EE架構——應用程序設計與部署的原理[M].北京:清華大學出版社,2006.
[5] 余浩東.J2EE應用框架設計與項目開發[M].北京:清華大學出版社,2008.
[6] 戎偉.揭秘J2EE項目開發的70個問題[M].北京:人民郵電出版社,2007.