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