java中三大框架和項(xiàng)目模擬面試題目_第1頁
java中三大框架和項(xiàng)目模擬面試題目_第2頁
java中三大框架和項(xiàng)目模擬面試題目_第3頁
java中三大框架和項(xiàng)目模擬面試題目_第4頁
java中三大框架和項(xiàng)目模擬面試題目_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、框架和項(xiàng)目模擬面試題目- 于洋 整理1. Struts2 框架題目1.1. struts2 工作流程Struts 2框架本身大致可以分為3個(gè)部分:核心控制器FilterDispatcher、業(yè)務(wù)控制器Action和用戶實(shí)現(xiàn)的企業(yè)業(yè)務(wù)邏輯組件。核心控制器FilterDispatcher是Struts 2框架的基礎(chǔ),包含了框架內(nèi)部的控制流程和處理機(jī)制。業(yè)務(wù)控制器Action和業(yè)務(wù)邏輯組件是需要用戶來自己實(shí)現(xiàn)的。用戶在開發(fā)Action和業(yè)務(wù)邏輯組件的同時(shí),還需要編寫相關(guān)的配置文件,供核心控制器FilterDispatcher來使用。Struts 2的工作流程相對于Struts 1要簡單,與WebWo

2、rk框架基本相同,所以說Struts 2是WebWork的升級(jí)版本。基本簡要流程如下:1 、客戶端初始化一個(gè)指向Servlet容器的請求;2、 這個(gè)請求經(jīng)過一系列的過濾器(Filter)(這些過濾器中有一個(gè)叫做ActionContextCleanUp的可選過濾器, 這個(gè)過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)3 、接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問ActionMapper來決定這個(gè)請是否需要調(diào)用某個(gè)Action4、如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatche

3、r把請求的處理交給ActionProxy5、ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調(diào)用的Action類6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。7、ActionInvocation實(shí)例使用命名模式來調(diào)用,在調(diào)用Action的過程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可 能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker

4、的模版。在表示的過程中可以使用Struts2 框架中繼承的標(biāo)簽。在這個(gè)過程中需要涉及到ActionMapper9、響應(yīng)的返回是通過我們在web.xml中配置的過濾器 10、如果ActionContextCleanUp是當(dāng)前使用的,則FilterDispatecher將不會(huì)清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,則將會(huì)去清理sreadlocals。1.2. 過濾器Filter和struts2攔截器的區(qū)別1、攔截器是基于java反射機(jī)制的,而過濾器是基于函數(shù)回調(diào)的。2、過濾器依賴于servlet容器,而攔截器不依賴于servlet容

5、器。3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。4、攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。1.3. 為什么要使用struts2框架Struts2 是一個(gè)相當(dāng)強(qiáng)大的Java Web開源框架,是一個(gè)基于POJO的Action的MVC Web框架。它基于當(dāng)年的Webwork和XWork框架,繼承其優(yōu)點(diǎn),同時(shí)做了相當(dāng)?shù)母倪M(jìn)。1.Struts2基于MVC架構(gòu),框架結(jié)構(gòu)清晰,開發(fā)流程一目了然,開發(fā)人員可以很好的掌控開發(fā)的過程。2使用OGNL進(jìn)行參數(shù)傳遞。OGNL提供了在Struts2里訪問各種作用域中的數(shù)據(jù)的簡單方式,你可以方便的獲取Request,

6、Attribute,Application,Session,Parameters中的數(shù)據(jù)。大大簡化了開發(fā)人員在獲取這些數(shù)據(jù)時(shí)的代碼量。3強(qiáng)大的攔截器Struts2 的攔截器是一個(gè)Action級(jí)別的AOP,Struts2中的許多特性都是通過攔截器來實(shí)現(xiàn)的,例如異常處理,文件上傳,驗(yàn)證等。攔截器是可配置與重用的,可以將一些通用的功能如:登錄驗(yàn)證,權(quán)限驗(yàn)證等置于攔截器中以完成一些Java Web項(xiàng)目中比較通用的功能。在我實(shí)現(xiàn)的的一Web項(xiàng)目中,就是使用Struts2的攔截器來完成了系統(tǒng)中的權(quán)限驗(yàn)證功能。4易于測試Struts2的Action都是簡單的POJO,這樣可以方便的對Struts2的Acti

7、on編寫測試用例,大大方便了5Java Web項(xiàng)目的測試。易于擴(kuò)展的插件機(jī)制在Struts2添加擴(kuò)展是一件愉快而輕松的事情,只需要將所需要的Jar包放到WEB-INF/lib文件夾中,在struts.xml中作一些簡單的設(shè)置就可以實(shí)現(xiàn)擴(kuò)展。6模塊化管理Struts2已經(jīng)把模塊化作為了體系架構(gòu)中的基本思想,可以通過三種方法來將應(yīng)用程序模塊化:將配置信息拆分成多個(gè)文件把自包含的應(yīng)用模塊創(chuàng)建為插件創(chuàng)建新的框架特性,即將與特定應(yīng)用無關(guān)的新功能組織成插件,以添加到多個(gè)應(yīng)用中去。7全局結(jié)果與聲明式異常為應(yīng)用程序添加全局的Result,和在配置文件中對異常進(jìn)行處理,這樣當(dāng)處理過程中出現(xiàn)指定異常時(shí),可以跳轉(zhuǎn)到

8、特定頁面。他的如此之多的優(yōu)點(diǎn),是很多人比較的青睞,與spring ,Hibernate進(jìn)行結(jié)合,組成了現(xiàn)在比較流行的ssh框架,當(dāng)然每個(gè)公司都要自己的框架,也是ssh變異的產(chǎn)品。1.4. struts2 有哪些優(yōu)點(diǎn)1)在軟件設(shè)計(jì)上Struts2的應(yīng)用可以不依賴于Servlet API和struts API。 Struts2的這種設(shè)計(jì)屬于無侵入式設(shè)計(jì);  2)攔截器,實(shí)現(xiàn)如參數(shù)攔截注入等功能;  3)類型轉(zhuǎn)換器,可以把特殊的請求參數(shù)轉(zhuǎn)換成需要的類型;  4)多種表現(xiàn)層技術(shù),如:JSP、freeMarker、

9、Velocity等;  5)Struts2的輸入校驗(yàn)可以對指定某個(gè)方法進(jìn)行校驗(yàn);  6)提供了全局范圍、包范圍和Action范圍的國際化資源文件管理實(shí)現(xiàn) 1.5. struts2 框架的核心控制器是什么?它有什么作用?1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。  2)作用:   負(fù)責(zé)攔截由<url-pattern>/*</url-pattern>指定的所有用戶請求,當(dāng)用戶請求到達(dá)時(shí),該Filter會(huì)過濾用戶的請求。默認(rèn)

10、情況下,如果用戶請求的路徑  不帶后綴或者后綴以.action結(jié)尾,這時(shí)請求將被轉(zhuǎn)入struts2框架處理,否則struts2框架將略過該請求的處理。  可以通過常量"struts.action.extension"修改action的后綴,如:  <constant name=nsion" value="do"/>  如果用戶需要指定多個(gè)請求后綴,則多個(gè)后綴之間以英文逗號(hào)(,)隔開。<constant name=&qu

11、ot;struts.action.extension" value="do,go"/>   1.6. struts2的配置文件的加載順序struts2 core 核心包 org/apache/struts2/perties (定義Struts2 常量)struts2 core 核心包 struts-default.xml (定義struts2 默認(rèn) package 、 攔截器、 結(jié)果類型)struts2 plugin 插件包 struts-plugin.xml(定義struts2 插件的配置)struts.

12、xml (自定義struts2 配置文件)perties (自定義struts2 常量文件)web.xml 中定義的struts2 常量1.7. struts2 如何訪問HttpServletRequest、HttpSession、ServletContext 三個(gè)域?qū)ο螅糠桨敢唬?#160; HttpServletRequest request =ServletActionContext.getRequest();  HttpServletResponse response =ServletActionContext.ge

13、tResponse();  HttpSession  session=   request.getSession(); ServletContext servletContext=ServletActionContext.getServletContext();      方案二:  類 implements ServletRequestAware,ServletResponseAware,SessionAware,

14、ServletContextAware  注意:框架自動(dòng)傳入對應(yīng)的域?qū)ο?#160;ps:ActionContext.getContext() 可以獲得三個(gè)Map對象,間接對三個(gè)域?qū)ο笾袛?shù)據(jù)進(jìn)行操作 1.8. struts2如何對指定的方法進(jìn)行驗(yàn)證?1)validate()方法會(huì)校驗(yàn)action中所有與execute方法簽名相同的方法; 2)要校驗(yàn)指定的方法通過重寫validateXxx()方法實(shí)現(xiàn), validateXxx()只會(huì)校驗(yàn)action中方法名為Xxx的方法。其中Xxx的第一個(gè)字母要大寫; 3)當(dāng)某個(gè)數(shù)據(jù)校驗(yàn)失敗時(shí),調(diào)用addFieldError()方法往系統(tǒng)的

15、fieldErrors添加校驗(yàn)失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport), 如果系統(tǒng) 的fieldErrors包含失敗信息,struts2會(huì)將請求轉(zhuǎn)發(fā)到名為input的result; 4)在input視圖中可以通過<s:fielderror/>顯示失敗信息。 5)先執(zhí)行validateXxxx()->validate()->如果出錯(cuò)了,會(huì)轉(zhuǎn)發(fā)<result name="input"/>所指定的頁面,如果不出錯(cuò),會(huì)直接進(jìn)行Action:execute()方法1.9. struts2

16、 默認(rèn)能解決get和post亂碼問題嗎不能。struts.i18n.encoding=UTF-8屬性值只能解析POST提交下的亂碼問題。1.10. 請說出struts2中至少5個(gè)默認(rèn)攔截器fileUpload 提供文件上傳功能 i18n 記錄用戶選擇的locale cookies 使用配置的name,value來是指cookies checkbox 添加了checkbox自動(dòng)處理代碼,將沒有選中的checkbox的內(nèi)容設(shè)定為false,而html默認(rèn)情況下不提交沒有選中的checkbox。 chain 讓前一個(gè)Action的屬性可以被后一個(gè)Action訪問,現(xiàn)在和chain類型的result(

17、)結(jié)合使用。 params 將請求參數(shù)封裝到Struts2 Action中 validate 執(zhí)行struts2 的請求參數(shù)校驗(yàn)workflow 判斷流程中是否存在FieldError ,如果存在,跳轉(zhuǎn)到input對象視圖modelDriven 將struts2 Action 實(shí)現(xiàn)ModelDriven 接口提供model對象壓入root棧頂部token 防止頁面表單重復(fù)提交1.11. 值棧ValueStack的原理和生命周期1)ValueStack貫穿整個(gè) Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一樣。當(dāng)Str

18、uts2接受一個(gè)請求時(shí),會(huì)迅速創(chuàng)建ActionContext,  ValueStack,action。然后把a(bǔ)ction存放進(jìn)ValueStack,所以action的實(shí)例變量可以被OGNL訪問。 請求來的時(shí)候,action、ValueStack的生命開始,請求結(jié)束,action、    ValueStack的生命結(jié)束;  2)action是多例的,和Servlet不一樣,Servelt是單例的;  3)每個(gè)action的都有一個(gè)對應(yīng)的值棧,值棧存放的數(shù)據(jù)類型是該action的實(shí)例,以及

19、該action中的實(shí)例變量,Action對象默認(rèn)保存在棧頂;  4)ValueStack本質(zhì)上就是一個(gè)ArrayList;  5)關(guān)于ContextMap,Struts 會(huì)把下面這些映射壓入 ContextMap 中:  parameters  :   該 Map 中包含當(dāng)前請求的請求參數(shù)  request     :   該 

20、Map 中包含當(dāng)前 request 對象中的所有屬性  session :該 Map 中包含當(dāng)前 session 對象中的所有屬性  application :該 Map 中包含當(dāng)前 application 對象中的所有屬性  attr:該 Map 按如下順序來檢索某個(gè)屬性: request, session, application  

21、         6)使用OGNL訪問值棧的內(nèi)容時(shí),不需要#號(hào),而訪問request、session、application、attr時(shí),需要加#號(hào);  7)注意: Struts2中,OGNL表達(dá)式需要配合Struts標(biāo)簽才可以使用。如:<s:property value="name"/>  8)在struts2配置文件中引用ognl表達(dá)式 ,引用值棧的值 ,此時(shí)使用的"$"

22、,而不是#或者%;  1.12. ActionContext、ServletContext、pageContext區(qū)別?1)ActionContext是當(dāng)前的Action的上下文環(huán)境,通過ActionContext可以獲取到request、session、ServletContext等與Action有關(guān)的對象的引用; 2)ServletContext是域?qū)ο螅粋€(gè)web應(yīng)用中只有一個(gè)ServletContext,生命周期伴隨整個(gè)web應(yīng)用; 3)pageContext是JSP中的最重要的一個(gè)內(nèi)置對象,可以通過pageContext獲取其他域?qū)ο蟮膽?yīng)用,同時(shí)它是一個(gè)域?qū)ο?,?/p>

23、用范圍只針對當(dāng)前頁面,當(dāng)前頁面結(jié)束時(shí),pageContext銷毀, 生命周期是JSP四個(gè)域?qū)ο笾凶钚〉摹?1.13. resul的type屬性中有哪些結(jié)果類型?dispatcherstruts默認(rèn)的結(jié)果類型,把控制權(quán)轉(zhuǎn)發(fā)給應(yīng)用程序里的某個(gè)資源不能把控制權(quán)轉(zhuǎn)發(fā)給一個(gè)外部資源,若需要把控制權(quán)重定向到一個(gè)外部資源, 應(yīng)該使用 redirect 把響應(yīng)重定向到另一個(gè)資源(包括一個(gè)外部資源) redirectAction把響應(yīng)重定向到另一個(gè) Action freemarker、velocity、chain、httpheader、xslt、plainText、stream struts2-json-plu

24、gin 自定義 json 結(jié)果類型,用于返回json格式數(shù)據(jù)1.14. 攔截器的生命周期與工作過程1)每個(gè)攔截器都是實(shí)現(xiàn)了Interceptor接口的 Java 類; 2)init(): 該方法將在攔截器被創(chuàng)建后立即被調(diào)用, 它在攔截器的生命周期內(nèi)只被調(diào)用一次. 可以在該方法中對相關(guān)資源進(jìn)行必要的初始化; 3)intercept(ActionInvocation invocation): 每攔截一個(gè)動(dòng)作請求, 該方法就會(huì)被調(diào)用一次; 4)destroy: 該方法將在攔截器被銷毀之前被調(diào)用, 它在攔截器的生命周期內(nèi)也只被調(diào)用一次; 2. Hibernate3 框架題目2.1. 為什么要使用Hib

25、ernate框架?它有什么優(yōu)勢?² Hibernate對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。 ² Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn),它很大程度的簡化了DAO層編碼工作。 ² Hibernate使用Java的反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序類實(shí)現(xiàn)透明性。² 因?yàn)樗且粋€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持很多關(guān)系型數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系。2.2. Hibernate工作原理(編程步驟)2.讀取并解析Hibernate映射文件,創(chuàng)建SessionFactory3.

26、打開Sesssion yantingxin4.創(chuàng)建事務(wù)Transation 5.持久化操作 6.提交事務(wù)7.關(guān)閉Session8.關(guān)閉SesstionFactory2.3. Hibernate是如何實(shí)現(xiàn)延遲加載的?延遲加載機(jī)制是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當(dāng)在真正需要數(shù)據(jù)的時(shí)候,才真正執(zhí)行數(shù)據(jù)加載操作。在Hibernate中提供了對實(shí)體對象的延遲加載、對集合的延遲加載和對屬性的延遲加載。當(dāng)Hibernate在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒有存儲(chǔ)在內(nèi)存中,只是使用Javassist為目標(biāo)類創(chuàng)建子類代理對象,當(dāng)程序真正對數(shù)據(jù)的進(jìn)行操作時(shí),代理對象的handler才去訪問數(shù)據(jù),加

27、載對象存在于內(nèi)存中,這就實(shí)現(xiàn)了延遲加載,它節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。2.4. Hibernate 有那幾種查詢方式(1) 導(dǎo)航對象圖查詢(2) OID查詢(3) HQL查詢(4) QBC查詢(5) 本地SQL查詢2.5. Hibernate中l(wèi)oad方法和get方法區(qū)別區(qū)別1:如果數(shù)據(jù)庫中沒有userId對應(yīng)的記錄,通過get方法加載,則返回的是null值;如果通過load方法加載,則返回一個(gè)代理對象,當(dāng)通過user對象調(diào)用某個(gè)方法(比如user.getPassword())時(shí),會(huì)拋出異常:org.hibernate.ObjectNotFoundException; 區(qū)別

28、2:load支持延遲加載,get不支持延遲加載。2.6. Hibernate持久化對象有幾種狀態(tài)?臨時(shí)狀態(tài)、游離狀態(tài)、持久化狀態(tài)2.7. HQL和SQL語句的區(qū)別?HQL面向?qū)ο?,而SQL操縱關(guān)系型數(shù)據(jù)庫2.8. 說下Hibernate的緩存機(jī)制緩存是介于應(yīng)用程序和物理數(shù)據(jù)源之間,其作用是為了降低應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源訪問的頻次,從而提高了應(yīng)用的運(yùn)行性能。Hibernate的緩存包括Session的緩存和SessionFactory的緩存,其中SessionFactory的緩存又可以分為兩類:內(nèi)置緩存和外置緩存。Session的緩存是內(nèi)置的,不能被卸載,也被稱為Hibernate的第一級(jí)緩存。S

29、essionFactory的內(nèi)置緩存和Session的緩存在實(shí)現(xiàn)方式上比較相似,前者是SessionFactory對象的一些集合屬性包含的數(shù)據(jù),后者是指Session的一些集合屬性包含的數(shù)據(jù)。SessionFactory的內(nèi)置緩存中存放了映射元數(shù)據(jù)和預(yù)定義SQL語句,映射元數(shù)據(jù)是映射文件中數(shù)據(jù)的拷貝,而預(yù)定義SQL語句是在Hibernate初始化階段根據(jù)映射元數(shù)據(jù)推導(dǎo)出來,SessionFactory的內(nèi)置緩存是只讀的,應(yīng)用程序不能修改緩存中的映射元數(shù)據(jù)和預(yù)定義SQL語句,因此SessionFactory不需要進(jìn)行內(nèi)置緩存與映射文件的同步。SessionFactory的外置緩存是一個(gè)可配置的插

30、件。在默認(rèn)情況下,SessionFactory不會(huì)啟用這個(gè)插件。外置緩存的數(shù)據(jù)是數(shù)據(jù)庫數(shù)據(jù)的拷貝,外置緩存的介質(zhì)可以是內(nèi)存或者硬盤。SessionFactory的外置緩存也被稱為Hibernate的第二級(jí)緩存。2.9. 如何優(yōu)化Hibernate? 初用HIBERNATE的人也許都遇到過性能問題,實(shí)現(xiàn)同一功能,用HIBERNATE與用JDBC性能相差十幾倍很正常,如果不及早調(diào)整,很可能影響整個(gè)項(xiàng)目的進(jìn)度。大體上,對于HIBERNATE性能調(diào)優(yōu)的主要考慮點(diǎn)如下:Ø 數(shù)據(jù)庫設(shè)計(jì)調(diào)整Ø HQL優(yōu)化Ø API的正確使用(如根據(jù)不同的業(yè)務(wù)類型選用不同的集合及查詢API)&#

31、216; 主配置參數(shù)(日志,查詢緩存,fetch_size, batch_size等)Ø 映射文件優(yōu)化(ID生成策略,二級(jí)緩存,延遲加載,關(guān)聯(lián)優(yōu)化)Ø 一級(jí)緩存的管理Ø 針對二級(jí)緩存,還有許多特有的策略Ø 事務(wù)控制策略。1、 數(shù)據(jù)庫設(shè)計(jì)a) 降低關(guān)聯(lián)的復(fù)雜性b) 盡量不使用聯(lián)合主鍵c) ID的生成機(jī)制,不同的數(shù)據(jù)庫所提供的機(jī)制并不完全一樣d) 適當(dāng)?shù)娜哂鄶?shù)據(jù),不過分追求高范式2、 HQL優(yōu)化HQL如果拋開它同HIBERNATE本身一些緩存機(jī)制的關(guān)聯(lián),HQL的優(yōu)化技巧同普通的SQL優(yōu)化技巧一樣,可以很容易在網(wǎng)上找到一些經(jīng)驗(yàn)之談。在性能瓶頸的地方使用硬編碼的

32、 JDBC。 3、 主配置a) 查詢緩存,同下面講的緩存不太一樣,它是針對HQL語句的緩存,即完全一樣的語句再次執(zhí)行時(shí)可以利用緩存數(shù)據(jù)。但是,查詢緩存在一個(gè)交易系統(tǒng)(數(shù)據(jù)變更頻繁,查詢條件相同的機(jī)率并不大)中可能會(huì)起反作用:它會(huì)白白耗費(fèi)大量的系統(tǒng)資源但卻難以派上用場。b) fetch_size,同JDBC的相關(guān)參數(shù)作用類似,參數(shù)并不是越大越好,而應(yīng)根據(jù)業(yè)務(wù)特征去設(shè)置c) batch_size同上。d) 生產(chǎn)系統(tǒng)中,切記要關(guān)掉SQL語句打印。4、 緩存a) 數(shù)據(jù)庫級(jí)緩存:這級(jí)緩存是最高效和安全的,但不同的數(shù)據(jù)庫可管理的層次并不一樣,比如,在ORACLE中,可以在建表時(shí)指定將整個(gè)表置于緩存當(dāng)中。b

33、) SESSION緩存:在一個(gè)HIBERNATE SESSION有效,這級(jí)緩存的可干預(yù)性不強(qiáng),大多于HIBERNATE自動(dòng)管理,但它提供清除緩存的方法,這在大批量增加/更新操作是有效的。比如,同時(shí)增加十萬條記錄,按常規(guī)方式進(jìn)行,很可能會(huì)發(fā)現(xiàn)OutofMemeroy的異常,這時(shí)可能需要手動(dòng)清除這一級(jí)緩存:Session.evict以及Session.clearc) 應(yīng)用緩存:在一個(gè)SESSIONFACTORY中有效,因此也是優(yōu)化的重中之重,因此,各類策略也考慮的較多,在將數(shù)據(jù)放入這一級(jí)緩存之前,需要考慮一些前提條件:i. 數(shù)據(jù)不會(huì)被第三方修改(比如,是否有另一個(gè)應(yīng)用也在修改這些數(shù)據(jù)?)ii. 數(shù)

34、據(jù)不會(huì)太大iii. 數(shù)據(jù)不會(huì)頻繁更新(否則使用CACHE可能適得其反)iv. 數(shù)據(jù)會(huì)被頻繁查詢v. 數(shù)據(jù)不是關(guān)鍵數(shù)據(jù)(如涉及錢,安全等方面的問題)。緩存有幾種形式,可以在映射文件中配置:read-only(只讀,適用于很少變更的靜態(tài)數(shù)據(jù)/歷史數(shù)據(jù)),nonstrict-read-write,read-write(比較普遍的形式,效率一般),transactional(JTA中,且支持的緩存產(chǎn)品較少)d) 分布式緩存:同c)的配置一樣,只是緩存產(chǎn)品的選用不同,在目前的HIBERNATE中可供選擇的不多,oscache, jboss cache,目前的大多數(shù)項(xiàng)目,對它們的用于集群的使用(特別是關(guān)鍵

35、交易系統(tǒng))都持保守態(tài)度。在集群環(huán)境中,只利用數(shù)據(jù)庫級(jí)的緩存是最安全的。5、 延遲加載a) 實(shí)體延遲加載:通過使用動(dòng)態(tài)代理實(shí)現(xiàn)b) 集合延遲加載:通過實(shí)現(xiàn)自有的SET/LIST,HIBERNATE提供了這方面的支持c) 屬性延遲加載:6、 方法選用a) 完成同樣一件事,HIBERNATE提供了可供選擇的一些方式,但具體使用什么方式,可能用性能/代碼都會(huì)有影響。顯示,一次返回十萬條記錄(List/Set/Bag/Map等)進(jìn)行處理,很可能導(dǎo)致內(nèi)存不夠的問題,而如果用基于游標(biāo)(ScrollableResults)或Iterator的結(jié)果集,則不存在這樣的問題。b) Session的load/get方

36、法,前者會(huì)使用二級(jí)緩存,而后者則不使用。c) Query和list/iterator,如果去仔細(xì)研究一下它們,你可能會(huì)發(fā)現(xiàn)很多有意思的情況,二者主要區(qū)別(如果使用了Spring,在HibernateTemplate中對應(yīng)find,iterator方法):i. list只能利用查詢緩存(但在交易系統(tǒng)中查詢緩存作用不大),無法利用二級(jí)緩存中的單個(gè)實(shí)體,但list查出的對象會(huì)寫入二級(jí)緩存,但它一般只生成較少的執(zhí)行SQL語句,很多情況就是一條(無關(guān)聯(lián))。ii. iterator則可以利用二級(jí)緩存,對于一條查詢語句,它會(huì)先從數(shù)據(jù)庫中找出所有符合條件的記錄的ID,再通過ID去緩存找,對于緩存中沒有的記錄,

37、再構(gòu)造語句從數(shù)據(jù)庫中查出,因此很容易知道,如果緩存中沒有任何符合條件的記錄,使用iterator會(huì)產(chǎn)生N+1條SQL語句(N為符合條件的記錄數(shù))iii. 通過iterator,配合緩存管理API,在海量數(shù)據(jù)查詢中可以很好的解決內(nèi)存問題,如:while(it.hasNext()YouObject object = (YouObject)it.next();session.evict(youObject);sessionFactory.evice(YouObject.class, youObject.getId();如果用list方法,很可能就出OutofMemory錯(cuò)誤了。iv. 通過上面的說明

38、,我想你應(yīng)該知道如何去使用這兩個(gè)方法了。7、 集合的選用在HIBERNATE 3.6文檔的“21.5理解集合性能”中有詳細(xì)的說明。² ists,maps 和 sets 用于更新效率最高² Bag 和 list 是反向集合類中效率最高的² 一次性刪除(One shot delete)8、 事務(wù)控制事務(wù)方面對性能有影響的主要包括:事務(wù)方式的選用,事務(wù)隔離級(jí)別以及鎖的選用a) 事務(wù)方式選用:如果不涉及多個(gè)事務(wù)管理器事務(wù)的話,不需要使用JTA,只有JDBC的事務(wù)控制就可以。b) 事務(wù)隔離級(jí)別:參見標(biāo)準(zhǔn)的SQL事務(wù)隔離級(jí)別c) 鎖的選用:悲觀鎖(一般由具體的事務(wù)管理器實(shí)現(xiàn))

39、,對于長事務(wù)效率低,但安全。樂觀鎖(一般在應(yīng)用級(jí)別實(shí)現(xiàn)),如在HIBERNATE中可以定義VERSION字段,顯然,如果有多個(gè)應(yīng)用操作數(shù)據(jù),且這些應(yīng)用不是用同一種樂觀鎖機(jī)制,則樂觀鎖會(huì)失效。因此,針對不同的數(shù)據(jù)應(yīng)有不同的策略,同前面許多情況一樣,很多時(shí)候我們是在效率與安全/準(zhǔn)確性上找一個(gè)平衡點(diǎn),無論如何,優(yōu)化都不是一個(gè)純技術(shù)的問題,你應(yīng)該對你的應(yīng)用和業(yè)務(wù)特征有足夠的了解。9、 批量操作即使是使用JDBC,在進(jìn)行大批數(shù)據(jù)更新時(shí),BATCH與不使用BATCH有效率上也有很大的差別。我們可以通過設(shè)置batch_size來讓其支持批量操作。舉個(gè)例子,要批量刪除某表中的對象,如“delete Accou

40、nt”,打出來的語句,會(huì)發(fā)現(xiàn)HIBERNATE找出了所有ACCOUNT的ID,再進(jìn)行刪除,這主要是為了維護(hù)二級(jí)緩存,這樣效率肯定高不了,在后續(xù)的版本中增加了bulk delete/update,但這也無法解決緩存的維護(hù)問題。也就是說,由于有了二級(jí)緩存的維護(hù)問題,HIBERNATE的批量操作效率并不盡如人意!從前面許多要點(diǎn)可以看出,很多時(shí)候我們是在效率與安全/準(zhǔn) 確性上找一個(gè)平衡點(diǎn),無論如何,優(yōu)化都不是一個(gè)純技術(shù)的問題,你應(yīng)該對你的應(yīng)用和業(yè)務(wù)特征有足夠的了解,一般的,優(yōu)化方案應(yīng)在架構(gòu)設(shè)計(jì)期就基本確定,否則 可能導(dǎo)致沒必要的返工,致使項(xiàng)目延期,而作為架構(gòu)師和項(xiàng)目經(jīng)理,還要面對開發(fā)人員可能的抱怨,必

41、竟,我們對用戶需求更改的控制力不大,但技術(shù)/架構(gòu)風(fēng)險(xiǎn)是應(yīng)該在初期意識(shí)到并制定好相關(guān)的對策。還有一點(diǎn)要注意,應(yīng)用層的緩存只是錦上添花,永遠(yuǎn)不要把它當(dāng)救命稻草,應(yīng)用的根基(數(shù)據(jù)庫設(shè)計(jì),算法,高效的操作語句,恰當(dāng)API的選擇等)才是最重要的。2.10. 如何解決關(guān)聯(lián)數(shù)據(jù)延遲加載NoSession問題 ² 在確定關(guān)聯(lián)數(shù)據(jù)是必須時(shí),可以配置 lazy=false 使用立即加載策略² 使用OpenSessionInView 模式,在需要數(shù)據(jù)時(shí),才去加載² 在程序中,根據(jù)業(yè)務(wù)需要,手動(dòng)Hibernate.initialize() 手動(dòng)初始化延遲加載數(shù)據(jù) 2.11. Hibern

42、ate 的 sessionfactory 和 session 的區(qū)別是什么?如何處理 session 線程不安全問題?sessionfactory 是一個(gè)數(shù)據(jù)源對應(yīng)著一個(gè) sessionfactory,也就說他是屬于二級(jí)緩存,如果是集群環(huán)境,他可以動(dòng)態(tài)的配置使用這個(gè)數(shù)據(jù)源或者不使用這個(gè)數(shù)據(jù)源,session 是等于一次回話,也就是說是一級(jí)緩存,并且是由 sessionfactory創(chuàng)建的,再有 sessionfactory 是線程安全的,相反的session 不安全的;解決 session 不安全的問題,就是大家通常用的常規(guī)寫法,一次會(huì)話后關(guān)閉 session,避免session 重用;2.1

43、2. Hibernate 如何實(shí)現(xiàn)動(dòng)態(tài)查詢?DetachedCriteria 與 Criteria 的區(qū)別是什么?條件查詢唄,編程的方式代替 HQL 語句,DetachedCriteria 單詞很簡明了,Detached 是分離,分離,分離什么,當(dāng)然是業(yè)務(wù)層的應(yīng)用,原本的Criteria 是與 session 綁定的,現(xiàn)在用DetachedCriteria這個(gè)來分離。3. Spring3 框架題目3.1. Spring框架的優(yōu)點(diǎn)² 方便解耦,簡化開發(fā)n Spring就是一個(gè)大工廠,可以將所有對象創(chuàng)建和依賴關(guān)系維護(hù),交給Spring管理² AOP編程的支持n Spring提供

44、面向切面編程,可以方便的實(shí)現(xiàn)對程序進(jìn)行權(quán)限攔截、運(yùn)行監(jiān)控等功能² 聲明式事務(wù)的支持n 只需要通過配置就可以完成對事務(wù)的管理,而無需手動(dòng)編程² 方便程序的測試n Spring對Junit4支持,可以通過注解方便的測試Spring程序² 方便集成各種優(yōu)秀框架n Spring不排斥各種優(yōu)秀的開源框架,其內(nèi)部提供了對各種優(yōu)秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持² 降低JavaEE API的使用難度n Spring 對JavaEE開發(fā)中非常難用的一些API(JDBC、JavaMail、遠(yuǎn)程調(diào)用等),都提供了封裝,使

45、這些API應(yīng)用難度大大降低3.2. 談?wù)勀憷斫獾腎oC和DI IOC是Inversion of Control的縮寫,控制反轉(zhuǎn),簡單來說就是把復(fù)雜系統(tǒng)分解成相互合作的對象,借助于“第三方”實(shí)現(xiàn)具有依賴關(guān)系的對象之間的解耦。 這里的第三方 就是指Ioc容器(Spring 框架),所有對象的創(chuàng)建權(quán),都交由Spring管理。DI的出現(xiàn),是對IoC的更近一步分析,既然IOC是控制反轉(zhuǎn),那么到底是“哪些方面的控制被反轉(zhuǎn)了呢?經(jīng)過詳細(xì)地分析和論證后,他得出了答案:“獲得依賴對象的過程被反轉(zhuǎn)了”??刂票环崔D(zhuǎn)之后,獲得依賴對象的過程由自身管理變?yōu)榱擞蒊OC容器主動(dòng)注入。依賴注入(DI)和控制反轉(zhuǎn)(IOC)是從

46、不同的角度的描述的同一件事情,就是指通過引入IOC容器,利用依賴關(guān)系注入的方式,實(shí)現(xiàn)對象之間的解耦。3.3. Spring中BeanFactory和ApplicationContext 的作用和區(qū)別?作用:1. BeanFactory負(fù)責(zé)讀取bean配置文檔,管理bean的加載,實(shí)例化,維護(hù)bean之間的依賴關(guān)系,負(fù)責(zé)bean的聲明周期。2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:a. 國際化支持b. 資源訪問:Resource rs = ctx. getResource(”classpath:p

47、erties”), “file:c:/perties”c. 事件傳遞:通過實(shí)現(xiàn)ApplicationContextAware接口3.4. Spring 中有幾種事務(wù)管理?編程式事務(wù)管理,通過TransactionTemplate 實(shí)現(xiàn) 聲明式事務(wù)管理,基于AOP 切面編程實(shí)現(xiàn) ,無需編碼,靈活性更高3.5. Spring 的 Bean作用域在spring2.0之前bean只有2種作用域即:singleton(單例)、non-singleton(也稱 prototype),Spring2.0以后,增加了session、request、global session三種專用于We

48、b應(yīng)用程序上下文的Bean。因此,默認(rèn)情況下Spring2.0現(xiàn)在有五種類型的Bean。1、singleton作用域當(dāng)一個(gè)bean的作用域設(shè)置為singleton,那么Spring IOC容器中只會(huì)存在一個(gè)共享的bean實(shí)例,并且所有對bean的請求,只要id與該bean定義相匹配,則只會(huì)返回bean的同一實(shí)例。換言之,當(dāng)把一個(gè)bean定義設(shè)置為singleton作用域時(shí),Spring IOC容器只會(huì)創(chuàng)建該bean定義的唯一實(shí)例。這個(gè)單一實(shí)例會(huì)被存儲(chǔ)到單例緩存(singleton cache)中,并且所有針對該bean的后續(xù)請求和引用都將返回被緩存的對象實(shí)例,這里要注意的是singleton作

49、用域和GOF設(shè)計(jì)模式中的單例是完全不同的,單例設(shè)計(jì)模式表示一個(gè)ClassLoader中只有一個(gè)class存在,而這里的singleton則表示一個(gè)容器對應(yīng)一個(gè)bean,也就是說當(dāng)一個(gè)bean被標(biāo)識(shí)為singleton時(shí)候,spring的IOC容器中只會(huì)存在一個(gè)該bean。2、prototypeprototype作用域部署的bean,每一次請求(將其注入到另一個(gè)bean中,或者以程序的方式調(diào)用容器的getBean()方法)都會(huì)產(chǎn)生一個(gè)新的bean實(shí)例,相當(dāng)于一個(gè)new的操作,對于prototype作用域的bean,有一點(diǎn)非常重要,那就是Spring不能對一個(gè) prototype bean的整個(gè)生命周期負(fù)責(zé),容器在初始化、配置、裝飾或者是裝配完一個(gè)prototype實(shí)例后,將它交給客戶端,隨后就對該prototype實(shí)例不聞不問了。不管何種作用域,容器都會(huì)調(diào)用所有對象的初始化生命周期回調(diào)方法,而對prototype而言,任何配置好的析構(gòu)生命周期回調(diào)方法都將不會(huì)被調(diào)用。3.6. Spring使用屬性注入方式兩種依賴注入的類型分別是setter注入和構(gòu)造方法注入。setter注入:

溫馨提示

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

評(píng)論

0/150

提交評(píng)論