J2EE面試題(五)

91. Session簡述 

HTTP協議 是“一次性單向”協議。 服務端不能主動連接客戶端,只能被動等待並答覆客戶端請求。客戶端連接服務端,發出一個HTTP Request,服務端處理請求,並且返回一個HTTP Response給客戶端,本次HTTP Request-Response Cycle結束。 我們看到,HTTP協議本身並不能支持服務端保存客戶端的狀態信息。於是,Web Server中引入了session的概念,用來保存客戶端的狀態信息。


Session實現原理

I、創建Session的時候,服務器將生成一個唯一的sessionid然後用它生成一個關閉瀏覽器就會失效的cookie。

II、然後再將一個與這個sessionid關聯的數據項加入散列表。

    例如這樣一段代碼:Session["UserName"]=23;

    假設sessionid爲123那麼散列表中會追加一行

     sessionid          username

     123                  23

III、當瀏覽器端提交到服務器時,會通過sessionid=123去散列表中尋找屬於該用戶的Session信息。

一般用來實現Session的方法有兩種: 
(1)URL重寫。 
Web Server在返回Response的時候,檢查頁面中所有的URL,包括所有的連接,和HTML Form的Action屬性,在這些URL後面加上“;jsessionid=XXX”。 
下一次,用戶訪問這個頁面中的URL。jsessionid就會傳回到Web Server。 
(2)Cookie。 
如果客戶端支持Cookie,Web Server在返回Response的時候,在Response的Header部分,加入一個“set-cookie: jsessionid=XXXX”header屬性,把jsessionid放在Cookie裏傳到客戶端。 客戶端會把Cookie存放在本地文件裏,下一次訪問Web Server的時候,再把Cookie的信息放到HTTP Request的“Cookie”header屬性裏面,這樣jsessionid就隨着HTTP Request返回給Web Server。


92. 寫出你熟悉的開源框架以及各自的作用(重點講SSH)
答:框架:hibernate,spring,struts1/struts2.
Hibernate主要用於數據持久化;封裝了JDBC操作;還提供了一個易用的、高效率的對象關係映射框架;
Spring 的控制反轉能起到解耦合的作用;
Struts 主要用於請求處理的流程控制;struts是基於MVC模式的,很好的將應用程序進行了分層,使開發者更關注於業務邏輯的實現;struts有着豐富的taglib,如能靈活運用,則能大大提高開發效率。Struts(表示層)+Spring(業務層)+Hibernate(持久層)


93. Struts對MVC的體現
M: 在Struts中,模型由JavaBean和EJB組件組成,用來實現程序的業務邏輯部分.
C: ActionServlet,RequestProcessor和Struts輔助類來實現控制器。ActionServlet是Struts中的核心控制器ActionServlet會根據在Struts配置文件中的配置將控制權轉交給相應的Action類。Action 類是業務的代理,在Action類中可以調用模型組件或者編寫其他業務邏輯代碼來完成一項具體的業務。
V: Struts框架中的視圖主要由JSP文件構成,在JSP文件中可應用Struts標籤和自定義標籤來表現模型組件中的數據進行簡單的處理。ActionForm Bean實際上是一個遵循了特殊約定的JavaBean,在Struts中ActionForm Bean可看作爲一箇中間存儲器在視圖與控制器之間進行數據傳遞。


94. struts如何實現國際化
以下以兩國語言(中文,英文)爲例:
》在工程中加入Struts支持

》 編輯ApplicationResource.properties文件,在其中加入要使用國際化的信息, 例如: lable.welcome.china=Welcome!!!
》創建英文資源文件ApplicationResource_en.properites
》創建臨時中文資源文件ApplicationResource_temp.properites 例如:lable.welcom.china=中國歡迎您!
》對臨時中文資源文件進行編碼轉換。可以使用myeclipse的插件,也可以在dos下執行:
native2ascii -encoding gb2312 ApplicationResource_temp.properties ApplicationResource_zh_CN.properties
》在jsp中加入struts的bean標記庫


95. Struts框架的數據驗證可分爲幾種類型?
表單驗證(由ActionForm Bean處理):如果用戶沒有在表單中輸入姓名,就提交表單,將生成表單驗證錯誤
業務邏輯驗證(由Action處理):如果用戶在表單中輸入的姓名爲“Monster”,按照本應用的業務規則,不允許向“Monster”打招呼,因此將生成業務邏輯錯誤。


96. 簡述Form Bean的表單驗證流程。
1、當用戶提交了HTML表單,Struts框架自動把表單數據組裝到ActionForm Bean中。
2、接下來Struts框架會調用ActionForm Bean的validate()方法進行表單驗證。
3、如果validate()方法返回的ActionErrors 對象爲null,或者不包含任何ActionMessage對象,就表示沒有錯誤,數據驗證通過。
4、如果ActionErrors中包含ActionMessage對象,就表示發生了驗證錯誤,Struts框架會把ActionErrors對象保存到request範圍內,然後把請求轉發到恰當的視圖組件,視圖組件通過<html:errors>標籤把request範圍內的ActionErrors對象中包含的錯誤消息顯示出來,提示用戶修改錯誤。


97. 簡單敘述ActionForm Bean的作用
1、ActionForm Bean也是一種JavaBean,除了具有一些JavaBean的常規方法,還包含一些特殊的方法,用於驗證HTML表單數據以及將其屬性重新設置爲默認值。
2、Struts框架利用ActionForm Bean來進行View組件和Controller組件之間表單數據的傳遞。
3、Struts框架把View組件接受到的用戶輸入的表單數據保存在ActionForm Bean中,把它傳遞給Controller組件,Controller組件可以對ActionForm Bean中的數據進行修改JSP文件使用Struts標籤讀取修改後的ActionForm Bean的信息,重新設置HTML表單。


98. Struts優缺點
優點:
1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.
2.有豐富的tag可以用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提高開發效率
3. 頁面導航
使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯繫,這對於後期的維護有着莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。
4. 提供Exception處理機制 .
5. 數據庫鏈接池管理
6. 支持I18N

缺點
1. 轉到展示層時,需要配置forward,如果有十個展示層的jsp,需要配置十次struts,而且還不包括有時候目錄、文件變更,需要重新修改forward,注意,每次修改配置之後,要求重新部署整個項目,而tomcate這樣的服務器,還必須重新啓動服務器
2. Struts 的Action必需是thread-safe方式,它僅僅允許一個實例去處理所有的請求。所以action用到的所有的資源都必需統一同步,這個就引起了線程安全的問題。
3. 測試不方便. Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴於Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase可以實現它的單元測試。
4. 類型的轉換. Struts的FormBean把所有的數據都作爲String類型,它可以使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,而且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是非常困難的。
5. 對Servlet的依賴性過強. Struts處理Action時必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。
6. 前端表達式語言方面.Struts集成了JSTL,所以它主要使用JSTL的表達式語言來獲取數據。可是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。
7.  對Action執行的控制困難. Struts創建一個Action,如果想控制它的執行順序將會非常困難。甚至你要重新去寫Servlet來實現你的這個功能需求。
8.  對Action 執行前和後的處理. Struts處理Action的時候是基於class的hierarchies,很難在action處理前和後進行操作。
9.  對事件支持不夠. 在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能 對應一個事件,struts這種事件方式稱爲application event,application event和component event相比是一種粗粒度的事件


99. Hibernate框架的認識(工作原理)
Hibernate是一個輕量級的持久層開源框架,它是連接Java應用程序和關係數據庫的中間件,負責Java對象和關係數據之間的映射.
Hibernate內部對JDBC API進行了封裝,負責Java對象的持久化.
因爲它封裝了所有的數據訪問細節,使得業務邏輯層可以專注於實現業務邏輯.
它是一種優秀的ORM映射工具,提供了完善的對象-關係映射服務,開發過程不依賴容器,靈活性非常大,可以無縫集成到任何一個java系統中


100. 爲什麼要用Hibernate
》封裝了jdbc,簡化了很多重複性代碼。
》簡化了DAO層編碼工作,使開發更對象化了。
》移植性好,支持各種數據庫,如果換個數據庫只要在配置文件中變換配置就可以了,不用改變hibernate代碼。
》支持透明持久化,因爲hibernate操作的是純粹的(pojo)java類,沒有實現任何接口,沒有侵入性。所以說它是一個輕量級框架。


101. 對象的3個狀態
》瞬時:一個實體通過new操作符創建後,沒有和Hibernate的Session建立關係,也沒有手動賦值過該實體的持久化標識(持久化標識可以認爲映射表的主鍵)。此時該實體中的任何屬性的更新都不會反映到數據庫表中。
》持久化:當一個實體和Hibernate的Session創建了關係,並獲取了持久化標識,而且在Hibernate的Session生命週期內存在。此時針對該實體任何屬性的更改都會直接影響到數據庫表中一條記錄對應字段的更新,也即與對應數據庫表保持同步。
》脫管:當一個實體和Hibernate的Session創建了關係,並獲取了持久化標識,
而此時Hibernate的Session的生命週期結束,實體的持久化標識沒有被改動過。
針對該實體的任何屬性的修改都不會及時反映到數據庫表中。


102. JDBC,Hibernate,EJB三者的區別?
EJB:我們必須遵守複雜的J2EE規範,Hibernate不強迫必須滿足特定的規範.EJB只能運行在EJB容器中,Hibernate可以運行在任何java環境中.目前,對於複雜的域模型,EJB容器提供的對象-關係映射能力有限.相比之下,Hibernate提供了完善的對象-關係映射服務.EJB雖然是一種可以移植的組件,但是實際上卻受到很大的限制,因爲各個產商生產CMP引擎差異,它們使用的對象-關係映射元數據各不相同,使得EJB不能順利的從一個EJB容器移植到另一個EJB容器當中.而Hibernate可以無縫集成到任何一個Java系統中.JDBC:實現業務邏輯的代碼和訪問數據庫的代碼混雜在一起,使程序結構不清晰,可讀性差


103. hibernate的核心類是什麼,它們的相互關係是什麼?重要的方法是什麼?
Configuration 接口:配置Hibernate,根據其啓動hibernate,創建SessionFactory 對象;
SessionFactory 接口:初始化Hibernate,充當數據存儲源的代理,創建session 對象,sessionFactory 是線程安全的,意味着它的同一個實例可以被應用的多個線程共享,是重量級、二級緩存;
Session 接口:負責保存、更新、刪除、加載和查詢對象,是線程不安全的,避免多個線程共享同一個session,是輕量級、一級緩存;
Session如下方法: save,load,update,delete,
Query q=CreateQuery(“from Customer where customerName=:customerName”)
beginTransaction, close, transaction, commit
Transaction 接口:管理事務;
Query 和Criteria 接口:執行數據庫的查詢。


104. Spring 註解
Spring 2.5 中除了提供 @Component 註釋外,還定義了幾個擁有特殊語義的註釋,它們分別是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,這 3 個註釋和 @Component 是等效的,但是從註釋類的命名上,很容易看出這 3 個註釋分別和持久層、業務層和控制層(Web 層)相對應。雖然目前這 3 個註釋和 @Component 相比沒有什麼新意,但 Spring 將在以後的版本中爲它們添加特殊的功能。所以,如果 Web 應用程序採用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別採用 @Repository、@Service 和 @Controller 對分層中的類進行註釋,而用 @Component 對那些比較中立的類進行註釋。

在 一個稍大的項目中,通常會有上百個組件,如果這些組件採用xml的bean定義來配置,顯然會增加配置文件的體積,查找以及維護起來也不太方便。 Spring2.5爲我們引入了組件自動掃描機制,他可以在類路徑底下尋找標註了 @Component,@Service,@Controller,@Repository註解的類,並把這些類納入進spring容器中管理。它的作用 和在xml文件中使用bean節點配置組件時一樣的。

@Service用於標註業務層組件,
@Controller用於標註控制層組件(如struts中的action),
@Repository用於標註數據訪問組件,即DAO組件,
@Component泛指組件,當組件不好歸類的時候,我們可以使用這個註解進行標註。


105. spring 的優點都有哪些?
1.降低了組件之間的耦合性 ,實現了軟件各層之間的解耦
2.可以使用容易提供的衆多服務,如事務管理,消息服務等
3.容器提供單例模式支持
4.容器提供了AOP技術,利用它很容易實現如權限攔截,運行期監控等功能
5.容器提供了衆多的輔助類,能加快應用的開發
6.spring對於主流的應用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring屬於低侵入式設計,代碼的污染極低
8.獨立於各種應用服務器
9.spring的DI機制降低了業務對象替換的複雜性
10.Spring的高度開放性,並不強制應用完全依賴於Spring,開發者可以自由選擇spring的部分或全部


106. Spring裏面如何配置數據庫驅動?
使用”org.springframework.jdbc.datasource.DriverManagerDataSource”數據源來配置數據庫驅動。

107. Spring裏面applicationContext.xml文件能不能改成其他文件名?
ContextLoaderListener是一個ServletContextListener, 它在你的web應用啓動的時候初始化。缺省情況下, 它會在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通過定義一個元素名字爲”contextConfigLocation”來改變Spring配置文件的位置。示例如下:
org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/xyz.xml


108. AOP裏面重要的幾個名詞概念解釋
切面(Aspect): 一個關注點的模塊化,這個關注點可能會橫切多個對象。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。 在Spring AOP中,切面可以使用通用類(基於模式的風格) 或者在普通類中以 @Aspect 註解(@AspectJ風格)來實現。
連接點(Joinpoint): 在程序執行過程中某個特定的點,比如某方法調用的時候或者處理異常的時候。 在Spring AOP中,一個連接點 總是 代表一個方法的執行。 通過聲明一個org.aspectj.lang.JoinPoint類型的參數可以使通知(Advice)的主體部分獲得連接點信息。
通知(Advice): 在切面的某個特定的連接點(Joinpoint)上執行的動作。通知有各種類型,其中包括“around”、“before”和“after”等通知。 通知的類型將在後面部分進行討論。許多AOP框架,包括Spring,都是以攔截器做通知模型, 並維護一個以連接點爲中心的攔截器鏈。
切入點(Pointcut): 匹配連接點(Joinpoint)的斷言。通知和一個切入點表達式關聯,並在滿足這個切入點的連接點上運行(例如,當執行某個特定名稱的方法時)。 切入點表達式如何和連接點匹配是AOP的核心:Spring缺省使用AspectJ切入點語法。
引入(Introduction): (也被稱爲內部類型聲明(inter-type declaration))。聲明額外的方法或者某個類型的字段。 Spring允許引入新的接口(以及一個對應的實現)到任何被代理的對象。 例如,你可以使用一個引入來使bean實現 IsModified 接口,以便簡化緩存機制。
目標對象(Target Object): 被一個或者多個切面(aspect)所通知(advise)的對象。也有人把它叫做 被通知(advised) 對象。 既然Spring AOP是通過運行時代理實現的,這個對象永遠是一個 被代理(proxied) 對象。
AOP代理(AOP Proxy): AOP框架創建的對象,用來實現切面契約(aspect contract)(包括通知方法執行等功能)。 在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。 注意:Spring 2.0最新引入的基於模式(schema-based)風格和@AspectJ註解風格的切面聲明,對於使用這些風格的用戶來說,代理的創建是透明的。
織入(Weaving): 把切面(aspect)連接到其它的應用程序類型或者對象上,並創建一個被通知(advised)的對象。 這些可以在編譯時(例如使用AspectJ編譯器),類加載時和運行時完成。 Spring和其他純Java AOP框架一樣,在運行時完成織入。


通知的類型:
前置通知(Before advice): 在某連接點(join point)之前執行的通知,但這個通知不能阻止連接點前的執行(除非它拋出一個異常)。

返回後通知(After returning advice): 在某連接點(join point)正常完成後執行的通知:例如,一個方法沒有拋出任何異常,正常返回。

拋出異常後通知(After throwing advice): 在方法拋出異常退出時執行的通知。

後通知(After (finally) advice): 當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。

環繞通知(Around Advice): 包圍一個連接點(join point)的通知,如方法調用。這是最強大的一種通知類型。 環繞通知可以在方法調用前後完成自定義的行爲。它也會選擇是否繼續執行連接點或直接返回它們自己的返回值或拋出異常來結束執行。

環繞通知是最常用的一種通知類型。大部分基於攔截的AOP框架,例如Nanning和JBoss4,都只提供環繞通知。

切入點(pointcut)和連接點(join point)匹配的概念是AOP的關鍵,這使得AOP不同於其它僅僅提供攔截功能的舊技術。 切入點使得定位通知(advice)可獨立於OO層次。 例如,一個提供聲明式事務管理的around通知可以被應用到一組橫跨多個對象中的方法上(例如服務層的所有業務操作)。


109. Action是不是線程安全的?如果不是 有什麼方式可以保證Action的線程安全?如果是,說明原因 


Action不是線程安全的,不定義類的域,就可以避免線程問題


110. logic標籤有哪幾個?
此標籤庫可以分爲三種類型:條件、循環、轉發/重定向。
(1) 條件類型 (沒標註的都比較簡單)
logic:empty, logic:notEmpty;
logic:equal, logic:notEqual, logic:lessThan,
logic:greaterThan,logic:lessEqual, logic:greaterEqual;
logic:present, logic:notPresent;
logic:match, logic:notMatch; 比較兩字符串是否相等,可以比較字符串的開始
的、結尾的或其中的某個部分。location屬性:指定從某個位置開始進行比較。
(2) 循環類型
logic:iterate
(3)轉發/重定向類型
logic:forward和logic:redirect
logic:forward標籤和jsp:forward標籤相似,但它可以使用global forward中的一
個ActionForward
例如:與上面相關的global forward中的代碼:
logic:redirect標籤和上面的標籤類似,但它默認調用的方法是
response.sendRedirect(),
取代了上面的requestDispatcher.forward()。最大的不同是它支持所有html:link
標籤的屬性,所以你能夠指定request參數:
在MVC框架下,不推薦使用這兩個標籤,你應該是從controller中選擇下一個
view,而不是從view中選擇.在Jsp頁面中不要過多的使用logic標籤。


111. action是單實例還是多實例,爲什麼?
action是單實例的。當多個用戶訪問一個請求的時候,服務器內存中只有一個與之對應的action類對象。因爲當服務器第一次加載struts的配置文件的時候,創建了一個Action後,每發送一個請求,服務器都會先去檢索相應的範圍內(request,session)是否存在這樣一個action實例,如果存在,則使用這個實例,如果不存在,則創建一個action實例。


112. dispatchAction是用什麼技術實現的?
DispatchAction 是Aciton的一個子類,主要解決了一個請求處理多個功能的問題
普通的Action你只能寫execute方法來處理業務,而想用這一個Action處理多個任
務,你必須要請求參數進行解析,用if語句塊來處理
舉一個小例子:
有如下一個url: http://localhost:8080/myApp/addUserAction.do
如果你處理這個url的是一個普通的Action,那麼就只能在execute裏面執行插入的
相關操作,如果換成一下url:http://localhost:8080/myApp/UserAction.do?method=add
你就應該根據method對象的值來執行相應的操作,如再有一個路徑http://localhost:8080/myApp/UserAction.do?method=delete這個還可以使用那個Action來處理的,只是多判斷一下而已.如果你用DispatchAction,就簡單多了,所以dispatchAction還是用的Action的這麼一個技術。


113. struts2.0的mvc模式?與struts1.0的區別?
struts2的mvc模式:當用戶在頁面提交用戶請求時,該請求需要提交給struts2的控
制器處理。struts2的控制器根據處理結果,決定將哪個頁面呈現給客戶端。與struts1最大的不同是:struts2的控制器。struts2的控制器不再像struts1的控
制器,需要繼承一個Action父類,甚至可以無需實現任何接口,struts2的Action就是一個普通的POJO。實際上,Struts2 的Action就是一個包含execute方法的普通Java類該類裏包含的多個屬性用於封裝用戶的請求參數。


114. STRUTS的配置文件是什麼?
struts-config.xml


115. update()和saveOrUpdate()的區別?
update()和saveOrUpdate()是用來對跨Session的PO進行狀態管理的。
update()方法操作的對象必須是持久化了的對象。也就是說,如果此對象在數據庫中不存在的話,就不能使用update()方法。saveOrUpdate()方法操作的對象既可以使持久化了的,也可以使沒有持久化的對象。如果是持久化了的對象調用saveOrUpdate()則會更新數據庫中的對象;如果是未持久化的對象使用此方法,則save到數據庫中。


116. hibernate的三種狀態之間如何轉換
當對象由瞬時狀態(Transient)一save()時,就變成了持久化狀態。當我們在Session裏存儲對象的時候,實際是在Session的Map裏存了一份,也就是它的緩存裏放了一份,然後,又到數據庫裏存了一份,在緩存裏這一份叫持久對象(Persistent)。Session 一 Close()了,它的緩存也都關閉了,整個Session也就失效了,
這個時候,這個對象變成了遊離狀態(Detached),但數據庫中還是存在的。當遊離狀態(Detached)update()時,又變爲了持久狀態(Persistent)。當持久狀態(Persistent)delete()時,又變爲了瞬時狀態(Transient),此時,數據庫中沒有與之對應的記錄。


117. hibernate拒絕連接、服務器崩潰的原因?最少寫5個
1. db沒有打開
2. 網絡連接可能出了問題
3. 連接配置錯了
4. 驅動的driver,url是否都寫對了
5. LIB下加入相應驅動,數據連接代碼是否有誤
6. 數據庫配置可能有問題
7. 當前聯接太多了,服務器都有訪問人數限制的
8. 服務器的相應端口沒有開,即它不提供相應的服務


118. Hibernate介紹
Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。
Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。
  Hibernate的核心接口一共有5個,分別爲:Session、SessionFactory、
Transaction、Query和Configuration。這5個核心接口在任何開發中都會用到。通過這些接口,不僅可以對持久化對象進行存取,還能夠進行事務控制。下面對這五個核心接口分別加以介紹。
  •Session接口:Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流,包含了很多常見的SQL語句。)。但需要注意的是Session對象是非線程安全的。同時,Hibernate的session不同於JSP應用中的HttpSession。這裏當使用session這個術語時,其實指的是Hibernate中的session,而以後會將HttpSesion對象稱爲用戶session。
  •SessionFactory接口:SessionFactroy接口負責初始化Hibernate。它充當數
據存儲源的代理,並負責創建Session對象。這裏用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因爲一般情況下,一個項目通常只需要一個
SessionFactory就夠,當需要操作多個數據庫時,可以爲每個數據庫指定一個
SessionFactory。
  •Configuration接口:Configuration接口負責配置並啓動Hibernate,創建
SessionFactory對象。在Hibernate的啓動的過程中,Configuration類的實例首先
定位映射文檔位置、讀取配置,然後創建SessionFactory對象。
  •Transaction接口:Transaction接口負責事務相關的操作。它是可選的,開發
人員也可以設計編寫自己的底層事務處理代碼。
  •Query和Criteria接口:Query和Criteria接口負責執行各種數據庫查詢。它可
以使用HQL語言或SQL語句兩種表達方式。


119. Hibernate源碼中幾個包的作用簡要介紹
  net.sf.hibernate.*  該包的類基本上都是接口類和異常類
  net.sf.hibernate.cache.*  JCS的實現類
  net.sf.hibernate.cfg.*  配置文件讀取類
  net.sf.hibernate.collection.*  Hibernate集合接口實現類,例如
List,Set,Bag等等,Hibernate之所以要自行編寫集合接口實現類是爲了支持
lazy loading
  net.sf.hibernate.connection.*  幾個數據庫連接池的Provider
  net.sf.hibernate.dialect.*  支持多種數據庫特性,每個Dialect實現類代
表一種數據庫,描述了該數據庫支持的數據類型和其它特點,例如是否有
AutoIncrement,是否有Sequence,是否有分頁sql等等
  net.sf.hibernate.eg.*  Hibernate文檔中用到的例子
  net.sf.hibernate.engine.*  這個包的類作用比較散
  net.sf.hibernate.expression.*  HQL支持的表達式
net.sf.hibernate.hq.*  HQL實現
net.sf.hibernate.id.*  ID生成器
  net.sf.hibernate.impl.*  最核心的包,一些重要接口的實現類,如果
Session,SessionFactory,Query等
  net.sf.hibernate.jca.*  JCA支持,把Session包裝爲支持JCA的接口實現類
  net.sf.hibernate.jmx.*  我不懂JMX,只知道JMX是用來編寫App Server的
管理程序的,大概是JMX部分接口的實現,使得App Server可以通過JMX接口管理
Hibernate
  net.sf.hibernate.loader.*  也是很核心的包,主要是生成sql語句的
  net.sf.hibernate.lob.*  Blob和Clob支持
  net.sf.hibernate.mapping.*  hbm文件的屬性實現
  net.sf.hibernate.metadata.*  PO的Meta實現
  net.sf.hibernate.odmg.*  ODMG是一個ORM標準,這個包是ODMG標準的實現類
  net.sf.hibernate.persister.*  核心包,實現持久對象和表之間的映射
  net.sf.hibernate.proxy.*  Proxy和Lazy Loading支持
  net.sf.hibernate.ps.*  該包是PreparedStatment Cache
  net.sf.hibernate.sql.*  生成JDBC sql語句的包
  net.sf.hibernate.test.*  測試類,你可以用junit來測試Hibernate
  net.sf.hibernate.tool.hbm2ddl.*  用hbm配置文件生成DDL
  net.sf.hibernate.transaction.*  Hibernate Transaction實現類
  net.sf.hibernate.type.*  Hibernate中定義的持久對象的屬性的數據類型
  net.sf.hibernate.util.*  一些工具類,作用比較散
  net.sf.hibernate.xml.*  XML數據綁定


120. 緩存管理
  Hibernate 中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬於事務範圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬於進程範圍或羣集範圍的緩存。這一級別的緩存可以進行配置和更改,並且可以動態加載和卸載。Hibernate還爲查詢結果提供了一個查詢緩存,它依賴於第二級緩存。
  1. 一級緩存和二級緩存的比較:第一級緩存 第二級緩存 存放數據的形式 相
互關聯的持久化對象 對象的散裝數據 緩存的範圍 事務範圍,每個事務都有單獨
的第一級緩存進程範圍或集羣範圍,緩存被同一個進程或集羣範圍內的所有事務共享 併發訪問策略由於每個事務都擁有單獨的第一級緩存,不會出現併發問題,無需提供併發訪問策略由於多個事務會同時訪問第二級緩存中相同數據,因此必須提供適當的併發訪問策略,來保證特定的事務隔離級別 數據過期策略沒有提供數據過期策略。處於一級緩存中的對象永遠不會過期,除非應用程序顯式清空緩存或者清除特定的對象必須提供數據過期策略,如基於內存的緩存中的對象的最大數目,允許對象處於緩存中的最長時間,以及允許對象處於緩存中的最長空閒時間 物理存儲介質內存內存和硬盤。對象的散裝數據首先存放在基於內在的緩存中,當內存中對象的數目達到數據過期策略中指定上限時,就會把其餘的對象寫入基於硬盤的緩存中。緩存的軟件實現 在Hibernate的Session的實現中包含了緩存的實現由第三方提供,Hibernate僅提供了緩存適配器(CacheProvider)。用於把特定的緩存插件集成到Hibernate中。啓用緩存的方式只要應用程序通過Session接口來執行保存、更新、刪除、加載和查詢數據庫數據的操作,Hibernate就會啓用第一級緩存,把數據庫中的數據以對象的形式拷貝到緩存中,對於批量更新和批量刪除操作,如果不希望啓用第一級緩存,可以繞過Hibernate API,直接通過JDBC API來執行指操作。用戶可以在單個類或類的單個集合的粒度上配置第二級緩存。如果類的實例被經常讀但很少被修改,就可以考慮使用第二級緩存。只有爲某個類或集合配置了第二級緩存,Hibernate在運行時纔會把它的實例加入到第二級緩存中。 用戶管理緩存的方式第一級緩存的物理介質爲內存,由於內存容量有限,必須通過恰當的檢索策略和檢索方式來限制加載對象的數目。Session的evit()方法可以顯式清空緩存中特定對象,但這種方法不值得推薦。 第二級緩存的物理介質可以是內存和硬盤,因此第二級緩存可以存放大量的數據,數據過期策略的maxElementsInMemory屬性值可以控制內存中的對象數目。管理第二級緩存主要包括兩個方面:選擇需要使用第二級緩存的持久類,設置合適的併發訪問策略:選擇緩存適配器,設置合適的數據過期策略。
  2. 一級緩存的管理: 當應用程序調用Session的save()、update()、
savaeOrUpdate()、get()或load(),以及調用查詢接口的 list()、iterate()或
filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該
對象加入到第一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變
化來同步更新數據庫。 Session爲應用程序提供了兩個管理緩存的方法:
evict(Object obj):從緩存中清除參數指定的持久化對象。 clear():清空緩存
中所有持久化對象。
  3. 二級緩存的管理:
  3.1. Hibernate的二級緩存策略的一般過程如下:
  1) 條件查詢的時候,總是發出一條select * from table_name where ….
(選擇所有字段)這樣的SQL語句查詢數據庫,一次獲得所有的數據對象。
  2) 把獲得的所有數據對象根據ID放入到第二級緩存中。
  3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;
查不到,如果配置了二級緩存,那麼從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。
  4) 刪除、更新、增加數據的時候,同時更新緩存。
  Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫
無作用。爲此,Hibernate提供了針對條件查詢的Query Cache。
  3.2. 什麼樣的數據適合存放到第二級緩存中? 1 很少被修改的數據 2 不是
很重要的數據,允許出現偶爾併發的數據 3 不會被併發訪問的數據 4 參考數據,
指的是供應用參考的常量數據,它的實例數目有限,它的實例會被許多其他類的實例引用,實例極少或者從來不會被修改。
  3.3. 不適合存放到第二級緩存的數據? 1 經常被修改的數據 2 財務數據,
絕對不允許出現併發 3 與其他應用共享的數據。
  3.4. 常用的緩存插件 Hibernater 的二級緩存是一個插件,下面是幾種常用
的緩存插件:
  EhCache:可作爲進程範圍的緩存,存放數據的物理介質可以是內存或硬盤,對Hibernate的查詢緩存提供了支持。
  OSCache:可作爲進程範圍的緩存,存放數據的物理介質可以是內存或硬盤,提供了豐富的緩存數據過期策略,對Hibernate的查詢緩存提供了支持。
  SwarmCache:可作爲羣集範圍內的緩存,但不支持Hibernate的查詢緩存。
  JBossCache:可作爲羣集範圍內的緩存,支持事務型併發訪問策略,對
Hibernate的查詢緩存提供了支持。
  3.5. 配置二級緩存的主要步驟:
  1) 選擇需要使用二級緩存的持久化類,設置它的命名緩存的併發訪問策略。
這是最值得認真考慮的步驟。
  2) 選擇合適的緩存插件,然後編輯該插件的配置文件。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章