J2EE的SSH框架的搭建和性能優(yōu)化畢業(yè)論文_第1頁
J2EE的SSH框架的搭建和性能優(yōu)化畢業(yè)論文_第2頁
J2EE的SSH框架的搭建和性能優(yōu)化畢業(yè)論文_第3頁
J2EE的SSH框架的搭建和性能優(yōu)化畢業(yè)論文_第4頁
J2EE的SSH框架的搭建和性能優(yōu)化畢業(yè)論文_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

保定電力職業(yè)技術學院頂崗實習技術應用論文題目J2EE的SSH框架的搭建和性能優(yōu)化系部信息工程與管理系專業(yè)班級軟件1101班學生姓名李朝云指導教師指導教師姓名二一四年三月三日保定電力職業(yè)技術學院頂崗實習技術應用(論文)2目錄J2EE的SSH框架的搭建和性能優(yōu)化4摘要41引言42SPRINGSTRUTSHIBERNATE簡介421STRUTS框架結構4211MODEL部分5212VIEW部分5213CONTROLLER組件522SPRING5221輕量5222控制反轉6223面向切面6224容器6225框架623HIBERNATE6231SESSION接口7232SESSIONFACTORY接口7233CONFIGURATION接口7234TRANSACTION接口7235QUERY和CRITERIA接口73闡述SSH整合框架731集成SSH框架74基于SSH框架的WEB應用系統(tǒng)的實現(xiàn)841數(shù)據(jù)持久層842業(yè)務邏輯層943表示層105SSH性能的優(yōu)化1151STRUTS優(yōu)化11511LOGGING和開發(fā)模式11512攔截器11513緩存和過期時間11514AJAXTHEMEDOJO或者CALENDAR標簽11515FREEMARK載入模板11516FREEMARK模板緩存12517模板路徑12518SESSION12保定電力職業(yè)技術學院頂崗實習技術應用(論文)3519標簽的使用1252SPRING優(yōu)化1353HIBERNATE優(yōu)化14531、數(shù)據(jù)庫設計14533、主配置14534、緩存14535、延遲加載15536、方法選用15537、集合的選用15538、事務控制16539、批量操作165310、HIBERNATE的緩存165311HIBERNATE性能調(diào)優(yōu)186結語21致謝22參考文獻23保定電力職業(yè)技術學院頂崗實習技術應用(論文)4J2EE的SSH框架的搭建和性能優(yōu)化姓名李朝云班級軟件1101班學號180111121摘要針對當前WEB應用程序開發(fā)面臨的問題,結合目前比較流行的開源框架SPRING、STRUTS和HIBERNATE,提出了一種開發(fā)J2EEWEB應用的輕量級解決方案,以幫助開發(fā)人員在短期內(nèi)搭建結構清晰、可復用性好、維護方便的WEB應用程序。并且,通過案例具體說明了如何將這一方案應用到實際項目中。關鍵詞J2EEMVCSTRUTSSPRINGHIBERNATE1引言大型企業(yè)級WEB應用系統(tǒng)的開發(fā)通常要求有一個良好的軟件架構、便于協(xié)作開發(fā)和擴展升級,而傳統(tǒng)的開發(fā)模式不能很好地滿足這些要求。本文針對當前WEB應用程序開發(fā)面臨的問題,結合目前比較流行的開源框架SSH(SPRING、STRUTS、HIBERNATE,提出一種開發(fā)J2EE企業(yè)級WEB應用的輕量級解決方案,并通過案例具體說明如何將這一方案應用到實際項目中。2SPRINGSTRUTSHIBERNATE簡介SSH在J2EE項目中表示了3種框架,即SPRINGSTRUTSHIBERNATE。STRUTS對MODEL,VIEW和CONTROLLER都提供了對應的組件。SPRING是一個輕量級的控制反轉IOC和面向切面AOP的容器框架,它由RODJOHNSON創(chuàng)建。它是為了解決企業(yè)應用開發(fā)的復雜性而創(chuàng)建的。SPRING使用基本的JAVABEAN來完成以前只可能由EJB完成的事情。HIBERNATE是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,可以應用在任何使用JDBC的場合,可以在SERVLET/JSP的WEB應用中使用,也可以在應用EJB的J2EE架構中取代CMP,完成數(shù)據(jù)持久化的重任。21STRUTS框架結構如圖保定電力職業(yè)技術學院頂崗實習技術應用(論文)5STRUTS對MODEL,VIEW和CONTROLLER都提供了對應的組件。在右圖中,ACTIONSERVLET,這個類是STRUTS的核心控制器,負責攔截來自用戶的請求。ACTION,這個類通常由用戶提供,該控制器負責接收來自ACTIONSERVLET的請求,并根據(jù)該請求調(diào)用模型的業(yè)務邏輯方法處理請求,并將處理結果返回給JSP頁面顯示。211MODEL部分由ACTIONFORM和JAVABEAN組成,其中ACTIONFORM用于封裝用戶的請求參數(shù),封裝成ACTIONFORM對象,該對象被ACTIONSERVLET轉發(fā)給ACTION,ACTION根據(jù)ACTIONFORM里面的請求參數(shù)處理用戶的請求。JAVABEAN則封裝了底層的業(yè)務邏輯,包括數(shù)據(jù)庫訪問等。212VIEW部分該部分采用JSP實現(xiàn)。STRUTS提供了豐富的標簽庫,通過標簽庫可以減少腳本的使用,自定義的標簽庫可以實現(xiàn)與MODEL的有效交互,并增加了現(xiàn)實功能。對應上圖的JSP部分。213CONTROLLER組件CONTROLLER組件有兩個部分組成系統(tǒng)核心控制器,業(yè)務邏輯控制器。系統(tǒng)核心控制器,對應上圖的ACTIONSERVLET。該控制器由STRUTS框架提供,繼承HTTPSERVLET類,因此可以配置成標注的SERVLET。該控制器負責攔截所有的HTTP請求,然后根據(jù)用戶請求決定是否要轉給業(yè)務邏輯控制器。業(yè)務邏輯控制器,負責處理用戶請求,本身不具備處理能力,而是調(diào)用MODEL來完成處理。對應ACTION部分。22SPRING簡介目的解決企業(yè)應用開發(fā)的復雜性功能使用基本的JAVABEAN代替EJB,并提供了更多的企業(yè)應用功能范圍任何JAVA應用簡單來說,SPRING是一個輕量級的控制反轉IOC和面向切面AOP的容器框架。221輕量從大小與開銷兩方面而言SPRING都是輕量的。完整的SPRING框架可以在一個大小只有1MB多的JAR文件里發(fā)布。并且SPRING所需的處理開銷也是微不足道的。此外,保定電力職業(yè)技術學院頂崗實習技術應用(論文)6SPRING是非侵入式的典型地,SPRING應用中的對象不依賴于SPRING的特定類。222控制反轉SPRING通過一種稱作控制反轉(IOC)的技術促進了松耦合。當應用了IOC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創(chuàng)建或者查找依賴對象。你可以認為IOC與JNDI相反不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。223面向切面SPRING提供了面向切面編程的豐富支持,允許通過分離應用的業(yè)務邏輯與系統(tǒng)級服務(例如審計(AUDITING)和事務(TRANSACTION)管理)進行內(nèi)聚性的開發(fā)。應用對象只實現(xiàn)它們應該做的完成業(yè)務邏輯僅此而已。它們并不負責(甚至是意識)其它的系統(tǒng)級關注點,例如日志或事務支持。224容器SPRING包含并管理應用對象的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個BEAN如何被創(chuàng)建基于一個可配置原型(PROTOTYPE),你的BEAN可以創(chuàng)建一個單獨的實例或者每次需要時都生成一個新的實例以及它們是如何相互關聯(lián)的。然而,SPRING不應該被混同于傳統(tǒng)的重量級的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。225框架SPRING可以將簡單的組件配置、組合成為復雜的應用。在SPRING中,應用對象被聲明式地組合,典型地是在一個XML文件里。SPRING也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發(fā)留給了你。所有SPRING的這些特征使你能夠編寫更干凈、更可管理、并且更易于測試的代碼。它們也為SPRING中的各種模塊提供了基礎支持。23HIBERNATE簡介HIBERNATE是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得JAVA程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。HIBERNATE可以應用在任何使用JDBC的場合,既可以在JAVA的客戶端程序使用,也可以在SERVLET/JSP的WEB應用中使用,最具革命意義的是,HIBERNATE可以在應用EJB的J2EE架構中取代CMP,完成數(shù)據(jù)持久化的重任。HIBERNATE的核心接口一共有5個,分別為SESSION、SESSIONFACTORY、TRANSACTION、QUERY和CONFIGURATION。這5個核心接口在任何開發(fā)中都會用到。通過這些接口,保定電力職業(yè)技術學院頂崗實習技術應用(論文)7不僅可以對持久化對象進行存取,還能夠進行事務控制。下面對這五個核心接口分別加以介紹。231SESSION接口SESSION接口負責執(zhí)行被持久化對象的CRUD操作CRUD的任務是完成與數(shù)據(jù)庫的交流,包含了很多常見的SQL語句。但需要注意的是SESSION對象是非線程安全的。同時,HIBERNATE的SESSION不同于JSP應用中的HTTPSESSION。這里當使用SESSION這個術語時,其實指的是HIBERNATE中的SESSION,而以后會將HTTPSESION對象稱為用戶SESSION。232SESSIONFACTORY接口SESSIONFACTORY接口負責初始化HIBERNATE。它充當數(shù)據(jù)存儲源的代理,并負責創(chuàng)建SESSION對象。這里用到了工廠模式。需要注意的是SESSIONFACTORY并不是輕量級的,因為一般情況下,一個項目通常只需要一個SESSIONFACTORY就夠,當需要操作多個數(shù)據(jù)庫時,可以為每個數(shù)據(jù)庫指定一個SESSIONFACTORY。233CONFIGURATION接口CONFIGURATION接口負責配置并啟動HIBERNATE,創(chuàng)建SESSIONFACTORY對象。在HIBERNATE的啟動的過程中,CONFIGURATION類的實例首先定位映射文檔位置、讀取配置,然后創(chuàng)建SESSIONFACTORY對象。234TRANSACTION接口TRANSACTION接口負責事務相關的操作。它是可選的,開發(fā)人員也可以設計編寫自己的底層事務處理代碼。235QUERY和CRITERIA接口QUERY和CRITERIA接口負責執(zhí)行各種數(shù)據(jù)庫查詢。它可以使用HQL語言或SQL語句兩種表達方式。3闡述SSH整合框架SSH在J2EE項目中表示了3種框架。那么怎樣將三者結合起來形成一個框架呢31集成SSH框架集成SSH框架的系統(tǒng)從職責上分為四層表示層、業(yè)務邏輯層、數(shù)據(jù)持久層和域模塊層。其中使用STRUTS作為系統(tǒng)的整體基礎架構,負責MVC的分離,在STRUTS框架的模型部分,利用HIBERNATE框架對持久層提供支持,業(yè)務層用SPRING支持。具體做法是用面向?qū)ο蟮姆治龇椒ǜ鶕?jù)需求提出一些模型,將這些模型實現(xiàn)為基本的JAVA保定電力職業(yè)技術學院頂崗實習技術應用(論文)8對象,然后編寫基本的DAO接口,并給出HIBERNATE的DAO實現(xiàn),采用HIBERNATE架構實現(xiàn)的DAO類來實現(xiàn)JAVA類與數(shù)據(jù)庫之間的轉換和訪問,最后由SPRING完成業(yè)務邏輯。系統(tǒng)的基本業(yè)務流程是在表示層中,首先通過JSP頁面實現(xiàn)交互界面,負責傳送請求REQUEST和接收響應RESPONSE,然后STRUTS根據(jù)配置文件STRUTSCONFIGXML將ACTIONSERVLET接收到的REQUEST委派給相應的ACTION處理。在業(yè)務層中,管理服務組件的SPRINGIOC容器負責向ACTION提供業(yè)務模型MODEL組件和該組件的協(xié)作對象數(shù)據(jù)處理DAO組件完成業(yè)務邏輯,并提供事務處理、緩沖池等容器組件以提升系統(tǒng)性能和保證數(shù)據(jù)的完整性。而在持久層中,則依賴于HIBERNATE的對象化映射和數(shù)據(jù)庫交互,處理DAO組件請求的數(shù)據(jù),并返回處理結果。采用上述開發(fā)模型,不僅實現(xiàn)了視圖、控制器與模型的徹底分離,而且還實現(xiàn)了業(yè)務邏輯層與持久層的分離。這樣無論前端如何變化,模型層只需很少的改動,并且數(shù)據(jù)庫的變化也不會對前端有所影響,大大提高了系統(tǒng)的可復用性。而且由于不同層之間耦合度小,有利于團隊成員并行工作,大大提高了開發(fā)效率。4基于SSH框架的WEB應用系統(tǒng)的實現(xiàn)下面將通過一個實際的系統(tǒng)來展示如何進行基于SSH框架的WEB應用開發(fā)。該系統(tǒng)是為某通信公司運營部開發(fā)的一個問答式系統(tǒng),功能類似于百度知道和新浪愛問。由于系統(tǒng)的模塊較多,下面就以一個用戶管理模塊為例來說明系統(tǒng)的開發(fā)實現(xiàn)過程,并將按照數(shù)據(jù)持久層、業(yè)務邏輯層、表示層的順序說明系統(tǒng)構建過程。41數(shù)據(jù)持久層數(shù)據(jù)持久層由JAVA對象持久化類和數(shù)據(jù)訪問對象DAO組成。每個數(shù)據(jù)庫表都對應著一個持久化對象,這樣就給予了開發(fā)者使用OO思想設計和開發(fā)的便利,同時也屏蔽了具體的數(shù)據(jù)庫和具體的數(shù)據(jù)表、字段,消除了對數(shù)據(jù)庫操作的硬編碼在重用性上的弊端。用戶信息表的部分結構如表1所HIBERNATE通過映射MAPPING文件將對象OBJECT與關系型數(shù)據(jù)RELATIONAL相關聯(lián),因此需要編寫和數(shù)據(jù)庫表相對應的JAVA持久化類以及對應的映射文件。有了JAVA持久化類后就可以在此基礎上實現(xiàn)數(shù)據(jù)訪問類。在SPRING框架中,數(shù)據(jù)訪問類可以從輔助類HIBERNATEDAOSUPPORT繼承,這極大地方便了HIBERNATE框架在SPRING中的使用,相應的部分代碼如下PUBLICCLASSUSERDAOEXTENDSHIBERNATEDAOSUPPORTPUBLICINTADDUSERUSERRETURNINTEGERPARSEINTTHISGETHIBERNATETEMPLATESAVEUSERTOSTRINGPUBLICLISTFINDALL保定電力職業(yè)技術學院頂崗實習技術應用(論文)9RETURNTHISGETHIBERNATETEMPLATELOADALLUSERCLASS具體的HIBERNATE數(shù)據(jù)源、SESSION工廠、事務管理、緩沖連接池等功能都由業(yè)務層的SPRING容器提供。42業(yè)務邏輯層業(yè)務邏輯層由SPRING框架支持,提供了處理業(yè)務邏輯的服務組件。開發(fā)者需要對業(yè)務對象建模,抽象出業(yè)務模型并封裝在MODEL組件中。由于數(shù)據(jù)持久層實現(xiàn)了JAVA持久化類并且封裝了數(shù)據(jù)訪問對象DAO,因此可以在MODEL組件中方便地調(diào)用DAO組件來存取數(shù)據(jù)。SPRING的IOC容器負責統(tǒng)一管理MODEL組件和DAO組件以及SPRING所提供的事務處理、緩沖連接池等服務組件。在用戶管理模塊中,通過業(yè)務建模創(chuàng)建了用戶模型USERSERVICE類,封裝了對用戶的權限管理以及積分管理等功能。USERSERVICE類通過調(diào)用數(shù)據(jù)訪問類USERDAO實現(xiàn)對用戶數(shù)據(jù)的操作。這些組件的關系將通過配置SPRING框架的APPLICATIONCONTEXTXML聯(lián)系起來,配置文件的主要內(nèi)容如下COMUNIWINZWDCBASEMODELREGIONCOM/UNIWIN/MODEL/CLASSHIBERNATEDIALECTORGHIBERNATECACHEEHCACHEPROVIDERTRUEHIBERNATESHOW_SQLHIBERNATEAUTO43表示層表示層結合JSP和STRUTS的TAGLIB庫處理顯示功能,利用ACTIONSERVLET將請求DO映射到相應的ACTION,并由ACTION調(diào)用業(yè)務邏輯的服務組件,然后根據(jù)處理結果跳轉到FORWORD對象指定的響應頁面。業(yè)務流程的部署由STRUTSCONFIGXML完成。下面以一個顯示所有用戶信息的請求LISTUSERDO為例來說明配置文件的使用?;贘2EE的WEB應用以其層次性、平臺無關性的優(yōu)勢已經(jīng)逐漸成為了電子商務、電子政務主要的解決方案。本文針對傳統(tǒng)的J2EEWEB應用開發(fā)的弊端,介紹了一種利用輕量級框架來快速搭建WEB應用的解決方案,并且通過其在實際項目中的應用,保定電力職業(yè)技術學院頂崗實習技術應用(論文)11證明了采用此方案可以幫助開發(fā)人員在短時間內(nèi)建立結構清晰、可重用性好、維護擴展方便的WEB應用程序。5SSH性能的優(yōu)化51STRUTS優(yōu)化511LOGGING和開發(fā)模式關閉LOGGING和開發(fā)模式DEVMODE,DEVMODE是在STRUTSPROPERTIES中設置的,關閉LOGGING需要修改WEBXML文件,加入以下參數(shù)DEBUG0DETAIL0512攔截器除非需要,否則不要使用攔截器INTERCEPTOR如果一個ACTION不需要全棧的攔截器的話,就使用BASICSTACK攔截器或移除不需要的攔截器。513緩存和過期時間正確設置頁面的CACHECONTROL和EXPIRES使用正確的HTTP頭(緩存控制和過期時間)當返回一個HTML頁面的時候,要保證HTML頁面包含正確的HEADER,使得瀏覽器可以知道怎樣緩存該HTML頁面。514AJAXTHEMEDOJO或者CALENDAR標簽STRUTS2提供的AJAXTHEMEDOJO或者CALENDAR標簽默認情況下保存在STRUTSJAR包里面,把這些JS文件或者CSS文件拷出來放到另外一個服務器上可以提高性能。當使用AJAXTHEME(DOJO)或日歷TAG時,從STRUTS2的JAR包復制靜態(tài)內(nèi)容到HTTP服務器。因為HTTP服務器會對這些靜態(tài)文件的請求進行優(yōu)化515FREEMARK載入模板如果使用FREEMARKER的話,在WEBINF下的CLASSES文件夾下創(chuàng)建一個FREEMARKERPROPERTIES并且加入TEMPLATE_UPDATE_DELAY60000,這個值是FREEMARKER多久從硬盤重新載入模板,保定電力職業(yè)技術學院頂崗實習技術應用(論文)12默認情況下是500MS,因為沒有必要檢查是不是需要重新載入模板文件,所以最好把它設置為一個很大的數(shù)字。516FREEMARK模板緩存啟用FREEMARKER模板緩存,這是STRUTSFREEMARKERTEMPLATESCACHE為TRUE,默認情況下這個是FALSE的。517模板路徑當覆蓋一個THEME時,COPY所有重要的模板到THEME目錄當TEMPLATE在當前目錄不能發(fā)現(xiàn)時,會有性能開銷。因為在返回父模板前,STRUTS2必須在當前目錄進行THEME檢查晚先時候,這個缺陷將要通過一個TEMPLATE緩存解決。518SESSION在你需要的時候才創(chuàng)建SESSION除非需要,STRUTS2不會創(chuàng)建SESSIONS比如,在你的攔截器STACK中有CREATESESSION攔截器。注意當使用SITEMESH時,一個SESSION將總是被創(chuàng)建看看HTTP/FORUMSOPENSYMPHONYCOM/THREADJSPAMESSAGEID5688的描述519標簽的使用當使用FREEMARKER時,盡量使用等價的FREEMARKER元素,代替JSP的標簽。FREEMARKER支持LIST迭代,顯示屬性,包含其他模版,MACROS等等使用等價的FREEMARKER元素代替STRUTS2的TAGS會有小的性能提升。例如將要被FOO代替1STRUTS2341JAR,XWORKCORE234JAR,FREEMARKER升級為23192OGNL升級為305(JAVASSIST3110JAR)3根包下增加FREEMARKERPROPERTIES文件,內(nèi)容為TEMPLATE_UPDATE_DELAY600004STRUTSXML增加和5把STRUTSXML中的默認攔截器定義為BASICSTACK執(zhí)行了這幾步之后,網(wǎng)站性能從5REQ/S提升至70REQ/S,請求處理時間從22S/REQ縮減至2S/REQ保定電力職業(yè)技術學院頂崗實習技術應用(論文)1352SPRING優(yōu)化DEFAULTAUTOWIRE“NO“/自動裝配設為否,當我們依賴注入的時候,用SET,GET方法,然后在SPRING配置文件中手動裝配以上這是手動裝配,還可以自動裝配,這樣就不用寫屬性了,直接就可以,自動裝配有幾個配置BYNAME試圖在容器中尋找和需要自動裝配的屬性名相同的BEAN或ID,如果沒有找到相應的BEAN,則這個屬性未被裝配上。BYTYPE試圖在容器中尋找一個與需要自動裝配的屬性類型相同的BEAN或ID,如果沒有找到,則該屬性未被裝配上。CONSTRUCTOR試圖在容器中尋找與需要自動裝配的BEAN的構造函數(shù)參數(shù)一致的一個或多個BEAN,如果沒找到則拋出異常。AUTODETECT首先嘗試使用CONSTRUCTOR來自動裝配,然后再使用BYTYPE方式。最常用的就是DEFAULTAUTOWIRE“BYNAME“,這樣只寫就可以,系統(tǒng)會自動查找和名字相關的來裝配依賴注入的。DEFAULTLAZYINIT“TRUE“延遲加載設為TRUE,這樣當SPRING啟動時就不會一次加載所有的BEAN了,當GETBEAN的時候才會被加載保定電力職業(yè)技術學院頂崗實習技術應用(論文)1453HIBERNATE優(yōu)化初用HIBERNATE的人也許都遇到過性能問題,實現(xiàn)同一功能,用HIBERNATE與用JDBC性能相差十幾倍很正常,如果不及早調(diào)整,很可能影響整個項目的進度。531、數(shù)據(jù)庫設計A降低關聯(lián)的復雜性B盡量不使用聯(lián)合主鍵CID的生成機制,不同的數(shù)據(jù)庫所提供的機制并不完全一樣D適當?shù)娜哂鄶?shù)據(jù),不過分追求高范式532、HQL優(yōu)化HQL如果拋開它同HIBERNATE本身一些緩存機制的關聯(lián),HQL的優(yōu)化技巧同普通的SQL優(yōu)化技巧一樣,可以很容易在網(wǎng)上找到一些經(jīng)驗之談。533、主配置A查詢緩存,同下面講的緩存不太一樣,它是針對HQL語句的緩存,即完全一樣的語句再次執(zhí)行時可以利用緩存數(shù)據(jù)。但是,查詢緩存在一個交易系統(tǒng)數(shù)據(jù)變更頻繁,查詢條件相同的機率并不大中可能會起反作用它會白白耗費大量的系統(tǒng)資源但卻難以派上用場。BFETCH_SIZE,同JDBC的相關參數(shù)作用類似,參數(shù)并不是越大越好,而應根據(jù)業(yè)務特征去設置CBATCH_SIZE同上。D生產(chǎn)系統(tǒng)中,切記要關掉SQL語句打印。534、緩存A數(shù)據(jù)庫級緩存這級緩存是最高效和安全的,但不同的數(shù)據(jù)庫可管理的層次并不一樣,比如,在ORACLE中,可以在建表時指定將整個表置于緩存當中。BSESSION緩存在一個HIBERNATESESSION有效,這級緩存的可干預性不強,大多于HIBERNATE自動管理,但它提供清除緩存的方法,這在大批量增加/更新操作是有效的。比如,同時增加十萬條記錄,按常規(guī)方式進行,很可能會發(fā)現(xiàn)OUTOFMEMEROY的異常,這時可能需要手動清除這一級緩存SESSIONEVICT以及SESSIONCLEARC應用緩存在一個SESSIONFACTORY中有效,因此也是優(yōu)化的重中之重,因此,各類策略也考慮的較多,在將數(shù)據(jù)放入這一級緩存之前,需要考慮一些前提條件I數(shù)據(jù)不會被第三方修改比如,是否有另一個應用也在修改這些數(shù)據(jù)II數(shù)據(jù)不會太大III數(shù)據(jù)不會頻繁更新否則使用CACHE可能適得其反IV數(shù)據(jù)會被頻繁查詢V數(shù)據(jù)不是關鍵數(shù)據(jù)如涉及錢,安全等方面的問題。緩存有幾種形式,可以在映射文件中配置READONLY只讀,適用于很少變更的保定電力職業(yè)技術學院頂崗實習技術應用(論文)15靜態(tài)數(shù)據(jù)/歷史數(shù)據(jù),NONSTRICTREADWRITE,READWRITE比較普遍的形式,效率一般,TRANSACTIONALJTA中,且支持的緩存產(chǎn)品較少D分布式緩存同C的配置一樣,只是緩存產(chǎn)品的選用不同,在目前的HIBERNATE中可供選擇的不多,OSCACHE,JBOSSCACHE,目前的大多數(shù)項目,對它們的用于集群的使用特別是關鍵交易系統(tǒng)都持保守態(tài)度。在集群環(huán)境中,只利用數(shù)據(jù)庫級的緩存是最安全的。535、延遲加載A實體延遲加載通過使用動態(tài)代理實現(xiàn)B集合延遲加載通過實現(xiàn)自有的SET/LIST,HIBERNATE提供了這方面的支持C屬性延遲加載536、方法選用A完成同樣一件事,HIBERNATE提供了可供選擇的一些方式,但具體使用什么方式,可能用性能/代碼都會有影響。顯示,一次返回十萬條記錄LIST/SET/BAG/MAP等進行處理,很可能導致內(nèi)存不夠的問題,而如果用基于游標SCROLLABLERESULTS或ITERATOR的結果集,則不存在這樣的問題。BSESSION的LOAD/GET方法,前者會使用二級緩存,而后者則不使用。CQUERY和LIST/ITERATOR,如果去仔細研究一下它們,你可能會發(fā)現(xiàn)很多有意思的情況,二者主要區(qū)別如果使用了SPRING,在HIBERNATETEMPLATE中對應FIND,ITERATOR方法ILIST只能利用查詢緩存但在交易系統(tǒng)中查詢緩存作用不大,無法利用二級緩存中的單個實體,但LIST查出的對象會寫入二級緩存,但它一般只生成較少的執(zhí)行SQL語句,很多情況就是一條無關聯(lián)。IIITERATOR則可以利用二級緩存,對于一條查詢語句,它會先從數(shù)據(jù)庫中找出所有符合條件的記錄的ID,再通過ID去緩存找,對于緩存中沒有的記錄,再構造語句從數(shù)據(jù)庫中查出,因此很容易知道,如果緩存中沒有任何符合條件的記錄,使用ITERATOR會產(chǎn)生N1條SQL語句N為符合條件的記錄數(shù)III通過ITERATOR,配合緩存管理API,在海量數(shù)據(jù)查詢中可以很好的解決內(nèi)存問題,如WHILEITHASNEXTYOUOBJECTOBJECTYOUOBJECTITNEXTSESSIONEVICTYOUOBJECTSESSIONFACTORYEVICEYOUOBJECTCLASS,YOUOBJECTGETID如果用LIST方法,很可能就出OUTOFMEMORY錯誤了。IV通過上面的說明,我想你應該知道如何去使用這兩個方法了。537、集合的選用在HIBERNATE31文檔的“195UNDERSTANDINGCOLLECTIONPERFORMANCE”保定電力職業(yè)技術學院頂崗實習技術應用(論文)16中有詳細的說明。538、事務控制事務方面對性能有影響的主要包括事務方式的選用,事務隔離級別以及鎖的選用A事務方式選用如果不涉及多個事務管理器事務的話,不需要使用JTA,只有JDBC的事務控制就可以。B事務隔離級別參見標準的SQL事務隔離級別C鎖的選用悲觀鎖一般由具體的事務管理器實現(xiàn),對于長事務效率低,但安全。樂觀鎖一般在應用級別實現(xiàn),如在HIBERNATE中可以定義VERSION字段,顯然,如果有多個應用操作數(shù)據(jù),且這些應用不是用同一種樂觀鎖機制,則樂觀鎖會失效。因此,針對不同的數(shù)據(jù)應有不同的策略,同前面許多情況一樣,很多時候我們是在效率與安全/準確性上找一個平衡點,無論如何,優(yōu)化都不是一個純技術的問題,你應該對你的應用和業(yè)務特征有足夠的了解。539、批量操作即使是使用JDBC,在進行大批數(shù)據(jù)更新時,BATCH與不使用BATCH有效率上也有很大的差別。我們可以通過設置BATCH_SIZE來讓其支持批量操作。舉個例子,要批量刪除某表中的對象,如“DELETEACCOUNT”,打出來的語句,會發(fā)現(xiàn)HIBERNATE找出了所有ACCOUNT的ID,再進行刪除,這主要是為了維護二級緩存,這樣效率肯定高不了,在后續(xù)的版本中增加了BULKDELETE/UPDATE,但這也無法解決緩存的維護問題。也就是說,由于有了二級緩存的維護問題,HIBERNATE的批量操作效率并不盡如人意從前面許多要點可以看出,很多時候我們是在效率與安全/準確性上找一個平衡點,無論如何,優(yōu)化都不是一個純技術的問題,你應該對你的應用和業(yè)務特征有足夠的了解,一般的,優(yōu)化方案應在架構設計期就基本確定,否則可能導致沒必要的返工,致使項目延期,而作為架構師和項目經(jīng)理,還要面對開發(fā)人員可能的抱怨,必竟,我們對用戶需求更改的控制力不大,但技術/架構風險是應該在初期意識到并制定好相關的對策。還有一點要注意,應用層的緩存只是錦上添花,永遠不要把它當救命稻草,應用的根基數(shù)據(jù)庫設計,算法,高效的操作語句,恰當API的選擇等才是最重要的。5310、HIBERNATE的緩存1、首先設置EHCACHE,建立配置文件EHCACHEXML,默認的位置在CLASSPATH,可以放到你的SRC目錄下保定電力職業(yè)技術學院頂崗實習技術應用(論文)17XMLVERSION“10“ENCODING“UTF8“EHCACHEDISKSTOREPATH“JAVAIOTMPDIR“/DEFAULTCACHEMAXELEMENTSINMEMORY“10000“緩存最大數(shù)目ETERNAL“FALSE“緩存是否持久OVERFLOWTODISK“TRUE“是否保存到磁盤,當系統(tǒng)當機時TIMETOIDLESECONDS“300“當緩存閑置N秒后銷毀TIMETOLIVESECONDS“180“當緩存存活N秒后銷毀DISKPERSISTENT“FALSE“DISKEXPIRYTHREADINTERVALSECONDS“120“/EHCACHE2、在HIBERNATE配置文件中設置設置HIBERNATE的緩存接口類,這個類在HIBERNATE包中PROPERTYNAME“CACHEPROVIDER_CLASS“ORGHIBERNATECACHEEHCACHEPROVIDER/PROPERTY是否使用查詢緩存PROPERTYNAME“HIBERNATECACHEUSE_QUERY_CACHE“TRUE/PROPERTY如果使用SPRING調(diào)用HIBERNATE的SESSIONFACTORY的話,這樣設置HIBERNATESESSION工廠管理BEANID“SESSIONFACTORY“CLASS“ORGSPRINGFRAMEWORKORMHIBERNATE3LOCALSESSIONFACTORYBEAN“PROPERTYNAME“DATASOURCE“REFBEAN“DATASOURCE“/PROPERTYPROPERTYNAME“HIBERNATEPROPERTIES“PROPSPROPKEY“HIBERNATEDIALECT“ORGHIBERNATEDIALECTORACLE9DIALECT/PROPPROPKEY“CONNECTIONPROVIDER_CLASS“ORGHIBERNATECONNECTIONC3P0CONNECTIONPROVIDER/PROPPROPKEY“HIBERNATESHOW_SQL“TRUE/PROPPROPKEY“HIBERNATECACHEUSE_QUERY_CACHE“TRUE/PROPPROPKEY“HIBERNATECACHEPROVIDER_CLASS“ORGHIBERNATECACHEEHCACHEPROVIDER/PROP/PROPS/PROPERTYPROPERTYNAME“MAPPINGDIRECTORYLOCATIONS“LISTVALUE/WEBINF/CLASSES/CN/RMIC/MANAGER/HIBERNATE/VALUE/LIST保定電力職業(yè)技術學院頂崗實習技術應用(論文)18/PROPERTY/BEAN說明一下如果不設置“查詢緩存”,那么HIBERNATE只會緩存使用LOAD方法獲得的單個持久化對象,如果想緩存使用FINDALL、LIST、ITERATOR、CREATECRITERIA、CREATEQUERY等方法獲得的數(shù)據(jù)結果集的話,就需要設置HIBERNATECACHEUSE_QUERY_CACHETRUE才行3、在HBM文件中添加CACHEUSAGE“READONLY“/4、如果需要“查詢緩存”,還需要在使用QUERY或CRITERIA時設置其SETCACHEABLETRUE屬性5311HIBERNATE性能調(diào)優(yōu)一。INVERSEINVERSEFALSEDEFAULT用于單向ONETOMANY關聯(lián)PARENTGETCHILDRENADDCHILD/INSERTCHILDPARENTGETCHILDRENDELETECHILD/DELETECHILDINVERSETRUE用于雙向ONETOMANY關聯(lián)CHILDSETPARENTPARENTSESSIONSAVECHILD/INSERTCHILDSESSIONDELETECHILD在分層結構的體系中PARENTDAO,CHILDDAO對于CRUD的封裝導致往往直接通過SESSION接口持久化對象,而很少通過關聯(lián)對象可達性二。ONETOMANY關系單向關系還是雙向關系PARENTGETCHILDRENADDCHILD對集合的觸及操作會導致LAZY的集合初始化,在沒有對集合配置二級緩存的情況下,應避免此類操作SELECTFROMCHILDWHEREPARENT_IDXXX性能口訣1一般情況下避免使用單向關聯(lián),盡量使用雙向關聯(lián)2使用雙向關聯(lián),INVERSE“TRUE”3在分層結構中通過DAO接口用SESSION直接持久化對象,避免通過關聯(lián)關系進行可達性持久化三。MANYTOONE關系單向MANYTOONE表達了外鍵存儲方靈活運用MANYTOONE可以避免一些不必要的性能問題保定電力職業(yè)技術學院頂崗實習技術應用(論文)19MANYTOONE表達的含義是0N1,MANY可以是0,可以是1,也可以是N,也就是說MANYTOONE可以表達一對多,一對一,多對一關系因此可以配置雙向MANYTOONE關系,例如1一桌四人打麻將,麻將席位和打麻將的人是什么關系是雙向MANYTOONE的關系四。ONETOONE通過主鍵進行關聯(lián)相當于把大表拆分為多個小表例如把大字段單獨拆分出來,以提高數(shù)據(jù)庫操作的性能HIBERNATE的ONETOONE似乎無法LAZY,必須通過BYTECODEENHANCEMENT五。集合LIST/BAG/SETONETOMANY1LIST需要維護INDEXCOLUMN,不能被用于雙向關聯(lián),必須INVERSE“FALSE”,被謹慎的使用在某些稀有的場合2BAG/SET語義上沒有區(qū)別3我個人比較喜歡使用BAGMANYTOMANY1BAG和SET語義有區(qū)別2。建議使用SET六。集合的過濾1CHILDRENSESSIONCREATEFILTERPARENTGETCHILDREN,“WHERETHISAGE5ANDTHISAGE10”LIST針對一對多關聯(lián)當中的集合元素非常龐大的情況,特別適合于龐大集合的分頁SESSIONCREATEFILTERPARENTGETCHILDREN,“”SETFIRSTRESULT0SETMAXRESULTS10LIST在HIBERNATE中用SUPERGETSESSIONCREATEFILTER,七。繼承關系當中的隱式多態(tài)HQLFROMOBJECT1把所有數(shù)據(jù)庫表全部查詢出來2POLYMORPHISM“IMPLICIT”DEFAULT將當前對象,和對象所有繼承子類全部一次性取出3POLYMORPHISM“EXPLICIT”,只取出當前查詢對象八。HIBERNATE二級緩存著名的N1問題FROMCHILD,然后在頁面上面顯示每個子類的父類信息,就會導致N條對PARENT表的查詢SELECTFROMPARENTWHEREIDSELECTFROMPARENTWHEREID解決方案保定電力職業(yè)技術學院頂崗實習技術應用(論文)201EAGERFETCH2二級緩存九。INVERSE和二級緩存的關系當使用集合緩存的情況下1INVERSE“FALSE”,通過PARENTGETCHILDREN來操作,HIBERNATE維護集合緩存2INVERSE“TRUE”,直接對CHILD進行操作,未能維護集合緩存導致緩存臟數(shù)據(jù)3雙向關聯(lián),INVERSE“TRUE”的情況下應避免使用集合緩存十。HIBERNATE二級緩存是提升WEB應用性能的法寶OLTP類型的WEB應用,由于應用服務器端可以進行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論