ssh面試寶典(必過).doc_第1頁
ssh面試寶典(必過).doc_第2頁
ssh面試寶典(必過).doc_第3頁
ssh面試寶典(必過).doc_第4頁
ssh面試寶典(必過).doc_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2012-SSH最新筆試面試題Struts1. struts1和struts2的區(qū)別?單例模式如果控制? struts1.2和struts2.0的對比 a、Action類: struts1.2要求Action類繼承一個基類。struts2.0 Action要求繼承ActionSupport基類 b、線程模式 struts1.2 Action是單例模式的并且必須是線程安全的,因為僅有一個Action的實例來處理所有的請求。 單例策略限制了Struts1.2 Action能做的事情,并且開發(fā)時特別小心。Action資源必須是線程安全的或同步的。 struts2.0 Action為每一個請求產(chǎn)生一個實例,因此沒有線程安全問題。 c、Servlet依賴 struts1.2 Action依賴于Servlet API,因為當一個Action被調(diào)用時HttpServletRequest和HttpServletResponse被傳遞給execut方法。 struts2.0 Action不依賴于容器,允許Action脫離容器單獨測試。如果需要,Struts2 Action仍然可以訪問初始的Request和Response。 但是,其他的元素減少或者消除了直接訪問HttpServletRequest和HttpServletResponse的必要性。 d、可測性 測試struts1.2 Action的一個主要問題是execute方法暴露了Servlet API(這使得測試要依賴于容器)。一個第三方擴展:struts TestCase 提供了一套struts1.2的模擬對象來進行測試。 Struts2.0 Action可以通過初始化、設置屬性、調(diào)用方法來測試,“依賴注入”也使得測試更容易。2. struts與spring是如何繼承的 不懂題目之意:是否是說的struts的action都繼承自org.apache.struts.action.Action 而Spring中的繼承就不清楚了。3. logic標簽有哪幾個? 此標簽庫可以分為三種類型:條件、循環(huán)、轉(zhuǎn)發(fā)/重定向。 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. 循環(huán)類型 logic:iterate 3. 轉(zhuǎn)發(fā)/重定向類型 logic:forward和logic:redirect logic:forward標簽和jsp:forward標簽相似,但它可以使用global forward中的一個ActionForward 例如: - 與上面相關的global forward中的代碼: logic:redirect標簽和上面的標簽類似,但它默認調(diào)用的方法是response.sendRedirect(), 取代了上面的requestDispatcher.forward()。最大的不同是它支持所有html:link標簽的屬性,所以你能夠指定request參數(shù): 在MVC框架下,不推薦使用這兩個標簽,你應該是從controller中選擇下一個view,而不是從view中選擇.在Jsp頁面中不要過多的使用logic標簽。4. action是單實例還是多實例,為什么? action是單實例的。當多個用戶訪問一個請求的時候,服務器內(nèi)存中只有一個與之對應的action類對象。 因為當服務器第一次加載struts的配置文件的時候,創(chuàng)建了一個Action后,每發(fā)送一個請求,服務器都會先去檢索相應的范圍內(nèi)(request,session)是否存在 這樣一個action實例,如果存在,則使用這個實例,如果不存在,則創(chuàng)建一個action實例。5. dispatchAction是用什么技術實現(xiàn)的? DispatchAction是Aciton的一個子類,主要解決了一個請求處理多個功能的問題 普通的Action你只能寫execute方法來處理業(yè)務,而想用這一個Action處理多個任務,你必須要請求參數(shù)進行解析,用if語句塊來處理 舉一個小例子: 有如下一個url: http:/localhost:8080/myApp/addUserAction.do 如果你處理這個url的是一個普通的Action,那么就只能在execute里面執(zhí)行插入的相關操作,如果換成一下url: http:/localhost:8080/myApp/UserAction.do?method=add 你就應該根據(jù)method對象的值來執(zhí)行相應的操作,如再有一個路徑http:/localhost:8080/myApp/UserAction.do?method=delete 這個還可以使用那個Action來處理的,只是多判斷一下而已. 如果你用DispatchAction,就簡單多了,所以dispatchAction還是用的Action的這么一個技術。6. struts2.0的mvc模式?與struts1.0的區(qū)別? struts2的mvc模式:當用戶在頁面提交用戶請求時,該請求需要提交給struts2的控制器處理。struts2的控制器根據(jù)處理結果, 決定將哪個頁面呈現(xiàn)給客戶端。 與struts1最大的不同是:struts2的控制器。struts2的控制器不再像struts1的控制器,需要繼承一個Action父類,甚至可以無需實現(xiàn) 任何接口,struts2的Action就是一個普通的POJO。實際上,Struts2 的Action就是一個包含execute方法的普通Java類 該類里包含的多個屬性用于封裝用戶的請求參數(shù)。7. struts的處理流程。一、ActionServlet的初始化ActionServlet作為Struts組件的前端控制器,由于web.xml的相應配置:0在應用一加載時即會被實例化并調(diào)用其init方法,init方法所做的主要工作有二:1. 加載struts配置文件,并創(chuàng)建用于封裝配置信息的ModuleConfig對象2. 加載資源文件,并創(chuàng)建用于封裝資源文件的MessageResources對象需要注意兩點:如果web.xml有多模塊配置,將創(chuàng)建多個ModuleConfig對象和MessageResources對象分別用于封裝各個模塊的struts配置文件和資源文件。針對各個模塊所創(chuàng)建的ModuleConfig對象和MessageResources對象將存儲在ServletContext中,對應的屬性名中有該模塊名稱的相應標識。另外,如果有相應配置的話,init方法還將初始化數(shù)據(jù)源和PlugIn8. Struts/webwork 的工作機制,它有哪些標簽Struts 2框架的大致處理流程如下:瀏覽器發(fā)送請求,例如請求/mypage.action、/reports/myreport.pdf等。核心控制器FilterDispatcher根據(jù)請求決定調(diào)用合適的Action。WebWork的攔截器鏈自動對請求應用通用功能,例如workflow、validation或文件上傳等功能?;卣{(diào)Action的execute方法,該execute方法先獲取用戶請求參數(shù),然后執(zhí)行某種數(shù)據(jù)庫操作,既可以是將數(shù)據(jù)保存到數(shù)據(jù)庫,也可以從數(shù)據(jù)庫中檢索信息。實際上,因為Action只是一個控制器,它會調(diào)用業(yè)務邏輯組件來處理用戶的請求。Action的execute方法處理結果信息將被輸出到瀏覽器中,可以是HTML頁面、圖像,也可以是PDF文檔或者其他文檔。此時支持的視圖技術非常多,既支持JSP,也支持Velocity、FreeMarker等模板技術。HibernateHibernate工作原理及為什么要用? 原理:hibernate,通過對jdbc進行封裝,對 java類和 關系數(shù)據(jù)庫進行mapping,實現(xiàn)了對關系數(shù)據(jù)庫的面向?qū)ο蠓绞降牟僮?,改變了傳統(tǒng)的jdbc + sql操作數(shù)據(jù)的方式,從而使開發(fā)人員可以話更多精力進行對象方面的開發(fā) 1.讀取并解析配置文件 2.讀取并解析映射信息,創(chuàng)建SessionFactory 3.打開Sesssion 4.創(chuàng)建事務Transation 5.持久化操作 6.提交事務 7.關閉Session 8.關閉SesstionFactory 為什么要用: 1. 對JDBC訪問數(shù)據(jù)庫的代碼做了封裝,大大簡化了數(shù)據(jù)訪問層繁瑣的重復性代碼。 2. Hibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實現(xiàn)。他很大程度的簡化DAO層的編碼工作 3. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數(shù)據(jù)庫,從一對一到多對多的各種復雜關系。 題目2: 什么是Hibernate延遲加載? 延遲加載機制是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正需要數(shù)據(jù)的時候,才真正執(zhí)行數(shù)據(jù)加載操作。在Hibernate中提供了對實體對象的延遲加載以及對集合的延遲加載,另外在Hibernate3中還提供了對屬性的延遲加載。題目3:Hibernate中類之間的關聯(lián)關系有幾種?(如:一對多、多對多的關系) many-to-one、one-to-many、many-to-many、 one-to-one題目4: 說下Hibernate的緩存機制 一、hibernate一級緩存(1)hibernate支持兩個級別的緩存,默認只支持一級緩存;(2)每個Session內(nèi)部自帶一個一級緩存;(3)某個Session被關閉時,其對應的一級緩存自動清除;二、hibernate二級緩存(1) 二級緩存獨立于session,默認不開啟;題目5: Hibernate的查詢方式 本地SQL查詢、Criteria、Hql題目6: 如何優(yōu)化Hibernate? 1.使用雙向一對多關聯(lián),不使用單向一對多 2.不用一對一,用多對一取代 3.配置對象緩存,不使用集合緩存 題目7: Struts工作機制?為什么要使用Struts? 工作機制: Struts的工作流程: 在web應用啟動時就會加載初始化ActionServlet,ActionServlet從 struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象 當ActionServlet接收到一個客戶請求時,將執(zhí)行如下流程. -(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在就返回請求路徑無效信息; -(2)如果ActionForm實例不存在,就創(chuàng)建一個ActionForm對象,把客戶提交的表單數(shù)據(jù)保存到ActionForm對象中; -(3)根據(jù)配置信息決定是否需要表單驗證.如果需要驗證,就調(diào)用ActionForm的validate()方法; -(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功; -(5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請求轉(zhuǎn)發(fā)給哪個Action,如果相應的 Action實例不存在,就先創(chuàng)建這個實例,然后調(diào)用Action的execute()方法; -(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉(zhuǎn)發(fā)給 ActionForward對象指向的JSP組件; -(7)ActionForward對象指向JSP組件生成動態(tài)網(wǎng)頁,返回給客戶; 為什么要用: 1. JSP、Servlet、JavaBean技術的出現(xiàn)給我們構建強大的企業(yè)應用系統(tǒng)提供了可能。但用這些技術構建的系統(tǒng)非常的繁亂。2. 基于Struts開發(fā)的應用:不用再考慮公共問題專心在業(yè)務實現(xiàn)上結構統(tǒng)一,易于學習、維護新手也可寫出好程序 1. 什么是Hibernate的并發(fā)機制?怎么去處理并發(fā)問題? Hibernate并發(fā)機制: a、Hibernate的Session對象是非線程安全的,對于單個請求,單個會話,單個的工作單元(即單個事務,單個線程),它通常只使用一次, 然后就丟棄。 如果一個Session 實例允許共享的話,那些支持并發(fā)運行的,例如Http request,session beans將會導致出現(xiàn)資源爭用。 如果在Http Session中有hibernate的Session的話,就可能會出現(xiàn)同步訪問Http Session。只要用戶足夠快的點擊瀏覽器的“刷新”, 就會導致兩個并發(fā)運行的線程使用同一個Session。 b、多個事務并發(fā)訪問同一塊資源,可能會引發(fā)第一類丟失更新,臟讀,幻讀,不可重復讀,第二類丟失更新一系列的問題。 解決方案:設置事務隔離級別。 Serializable:串行化。隔離級別最高 Repeatable Read:可重復讀 Read Committed:已提交數(shù)據(jù)讀 Read Uncommitted:未提交數(shù)據(jù)讀。隔離級別最差 設置鎖:樂觀鎖和悲觀鎖。 樂觀鎖:使用版本號或時間戳來檢測更新丟失,在的映射中設置 optimistic-lock=all可以在沒有版本或者時間戳屬性映射的情況下實現(xiàn) 版本檢查,此時Hibernate將比較一行記錄的每個字段的狀態(tài) 行級悲觀鎖:Hibernate總是使用數(shù)據(jù)庫的鎖定機制,從不在內(nèi)存中鎖定對象!只要為JDBC連接指定一下隔 離級別,然后讓數(shù)據(jù)庫去搞定一切就夠了。類LockMode 定義了Hibernate所需的不同的鎖定級別:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;2. Hibernate和spring中常出現(xiàn)的幾個異常 org.springframework.beans.factory.BeanCreationException: Error creating bean with name sessionFactory defined in ServletContext resource /WEB-INF/applicationContext.xml: Initialization of bean failed; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.xindeco.myregister.pojo.MyRegisterInfo column: password (should be mapped with insert=false update=false) 出錯原因:password 和repassword同時對應數(shù)據(jù)庫表中的password一列,同時update和insert都設為true。xml文件如下: 解決方法:將repassword的insert和update設為false。 org.springframework.beans.factory.BeanCreationException: Error creating bean with name sessionFactory defined in ServletContext resource /WEB-INF/applicationContext.xml: Initialization of bean failed;nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class 錯誤原因:hibernate的映射文件中ID是大寫的,而pojo的類中id是小寫的 解決方法:要么將pojo類中的id改稱大寫,要么把hibernate的映射文件中的ID改稱小寫。3. Hibernate與jdbc的聯(lián)系 hibernate是jdbc的輕量級封裝,包括jdbc的與數(shù)據(jù)庫的連接(用perty的配置文件實現(xiàn)當然本質(zhì)是封裝了jdbc的forname), 和查詢,刪除等代碼,都用面向?qū)ο蟮乃枷胗么a聯(lián)系起來,hibernate通過hbm 配置文件把po類的字段和數(shù)據(jù)庫的字段關聯(lián)起來比如數(shù)據(jù)庫的id, 在po類中就是pravite Long id; public Long getId() ;public setId(Long id); 然后hql語句也是面向?qū)ο蟮模牟樵冋Z句不是查詢數(shù)據(jù)庫而是查詢類的,這些實現(xiàn)的魔法就是xml文件,其實hibernate=封裝的jdbc+xml文件4. Hibernate與spring的聯(lián)系 hibernate中的一些對象可以給Spring來管理,讓Spring容器來創(chuàng)建hibernate中一些對象實例化。例如:SessionFactory,HibernateTemplate等。 Hibernate本來是對數(shù)據(jù)庫的一些操作,放在DAO層,而Spring給業(yè)務層的方法定義了事務,業(yè)務層調(diào)用DAO層的方法,很好的將Hibernate的操作也加入到事務中來了。5. Hibernate自帶的分頁機制是什么?如果不使用Hibernate自帶的分頁,則采用什么方式分頁? 1、hibernate自帶的分頁機制:獲得Session對象后,從Session中獲得Query對象。用Query.setFirstResult():設置要顯示的第一行數(shù)據(jù), Query.setMaxResults():設置要顯示的最后一行數(shù)據(jù)。 2、不使用hibernate自帶的分頁,可采用sql語句分頁, 如:5:為每頁顯示的記錄,2為當前頁: select * top 5 from table where tabId not in (select tabId top (2-1)*5 from table); 6. hibernate的對象的三種持久化狀態(tài),并給出解釋? 不清楚hibernate的對象的三種持久化狀態(tài),只知道hibernate對象的三種狀態(tài),下面有介紹。7. hibernate中一對多配置文件返回的是什么? hibernate中一對多配置文件會相應的映射為兩張表,并且它們之間的關系是一對多的。例如:一個student和classes表的關系 。一個學生只能是一個班的,一個班可以有多個學生。8. update()和saveOrUpdate()的區(qū)別? update()和saveOrUpdate()是用來對跨Session的PO進行狀態(tài)管理的。 update()方法操作的對象必須是持久化了的對象。也就是說,如果此對象在數(shù)據(jù)庫中不存在的話,就不能使用update()方法。 saveOrUpdate()方法操作的對象既可以使持久化了的,也可以使沒有持久化的對象。如果是持久化了的對象調(diào)用saveOrUpdate()則會 更新數(shù)據(jù)庫中的對象;如果是未持久化的對象使用此方法,則save到數(shù)據(jù)庫中。9. hibernate的三種狀態(tài)之間如何轉(zhuǎn)換 當對象由瞬時狀態(tài)(Transient)一save()時,就變成了持久化狀態(tài)。 當我們在Session里存儲對象的時候,實際是在Session的Map里存了一份, 也就是它的緩存里放了一份,然后,又到數(shù)據(jù)庫里存了一份,在緩存里這一份叫持久對象(Persistent)。 Session 一 Close()了,它的緩存也都關閉了,整個Session也就失效了, 這個時候,這個對象變成了游離狀態(tài)(Detached),但數(shù)據(jù)庫中還是存在的。 當游離狀態(tài)(Detached)update()時,又變?yōu)榱顺志脿顟B(tài)(Persistent)。 當持久狀態(tài)(Persistent)delete()時,又變?yōu)榱怂矔r狀態(tài)(Transient), 此時,數(shù)據(jù)庫中沒有與之對應的記錄。10. hibernate拒絕連接、服務器崩潰的原因?最少寫5個1. db沒有打開 2. 網(wǎng)絡連接可能出了問題3. 連接配置錯了4. 驅(qū)動的driver,url是否都寫對了5. LIB下加入相應驅(qū)動,數(shù)據(jù)連接代碼是否有誤6. 數(shù)據(jù)庫配置可能有問題7. 當前聯(lián)接太多了,服務器都有訪問人數(shù)限制的8. 服務器的相應端口沒有開,即它不提供相應的服務9 hibernate有哪些緩存,分別怎么使用?10 你對hibernate的了解到了一個什么樣的程度?11 寫出一個sql語句體現(xiàn)hibernate中一對多的關系11. Hibernate介紹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ā)中都會用到。通過這些接口,不僅可以對持久化對象進行存取,還能夠進行事務控制。下面對這五個核心接口分別加以介紹。Session接口:Session接口負責執(zhí)行被持久化對象的CRUD操作(CRUD的任務是完成與數(shù)據(jù)庫的交流,包含了很多常見的SQL語句。)。但需要注意的是Session對象是非線程安全的。同時,Hibernate的session不同于JSP應用中的HttpSession。這里當使用session這個術語時,其實指的是Hibernate中的session,而以后會將HttpSesion對象稱為用戶session。SessionFactory接口:SessionFactroy接口負責初始化Hibernate。它充當數(shù)據(jù)存儲源的代理,并負責創(chuàng)建Session對象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數(shù)據(jù)庫時,可以為每個數(shù)據(jù)庫指定一個SessionFactory。Configuration接口:Configuration接口負責配置并啟動Hibernate,創(chuàng)建SessionFactory對象。在Hibernate的啟動的過程中,Configuration類的實例首先定位映射文檔位置、讀取配置,然后創(chuàng)建SessionFactory對象。Transaction接口:Transaction接口負責事務相關的操作。它是可選的,開發(fā)人員也可以設計編寫自己的底層事務處理代碼。Query和Criteria接口:Query和Criteria接口負責執(zhí)行各種數(shù)據(jù)庫查詢。它可以使用HQL語言或SQL語句兩種表達方式。 12. Hibernate主鍵介紹AssignedAssigned方式由程序生成主鍵值,并且要在save()之前指定否則會拋出異常特點:主鍵的生成值完全由用戶決定,與底層數(shù)據(jù)庫無關。用戶需要維護主鍵值,在調(diào)用session.save()之前要指定主鍵值。HiloHilo使用高低位算法生成主鍵,高低位算法使用一個高位值和一個低位值,然后把算法得到的兩個值拼接起來作為數(shù)據(jù)庫中的唯一主鍵。Hilo方式需要額外的數(shù)據(jù)庫表和字段提供高位值來源。默認請況下使用的表是hibernate_unique_key,默認字段叫作next_hi。next_hi必須有一條記錄否則會出現(xiàn)錯誤。特點:需要額外的數(shù)據(jù)庫表的支持,能保證同一個數(shù)據(jù)庫中主鍵的唯一性,但不能保證多個數(shù)據(jù)庫之間主鍵的唯一性。Hilo主鍵生成方式由Hibernate 維護,所以Hilo方式與底層數(shù)據(jù)庫無關,但不應該手動修改hi/lo算法使用的表的值,否則會引起主鍵重復的異常。IncrementIncrement方式對主鍵值采取自動增長的方式生成新的主鍵值,但要求底層數(shù)據(jù)庫的支持Sequence。如Oracle,DB2等。需要在映射文件xxx.hbm.xml中加入Increment標志符的設置。特點:由Hibernate本身維護,適用于所有的數(shù)據(jù)庫,不適合多進程并發(fā)更新數(shù)據(jù)庫,適合單一進程訪問數(shù)據(jù)庫。不能用于群集環(huán)境。IdentityIdentity當時根據(jù)底層數(shù)據(jù)庫,來支持自動增長,不同的數(shù)據(jù)庫用不同的主鍵增長方式。特點:與底層數(shù)據(jù)庫有關,要求數(shù)據(jù)庫支持Identity,如MySQl中是auto_increment, SQL Server 中是Identity,支持的數(shù)據(jù)庫有MySql、SQL Server、DB2、Sybase和HypersonicSQL。 Identity無需Hibernate和用戶的干涉,使用較為方便,但不便于在不同的數(shù)據(jù)庫之間移植程序。SequenceSequence需要底層數(shù)據(jù)庫支持Sequence方式,例如Oracle數(shù)據(jù)庫等特點:需要底層數(shù)據(jù)庫的支持序列,支持序列的數(shù)據(jù)庫有DB2、PostgreSql、Qracle、SAPDb等在不同數(shù)據(jù)庫之間移植程序,特別從支持序列的數(shù)據(jù)庫移植到不支持序列的數(shù)據(jù)庫需要修改配置文件NativeNative主鍵生成方式會根據(jù)不同的底層數(shù)據(jù)庫自動選擇Identity、Sequence、Hilo主鍵生成方式特點:根據(jù)不同的底層數(shù)據(jù)庫采用不同的主鍵生成方式。由于Hibernate會根據(jù)底層數(shù)據(jù)庫采用不同的映射方式,因此便于程序移植,項目中如果用到多個數(shù)據(jù)庫時,可以使用這種方式。UUIDUUID使用128位UUID算法生成主鍵,能夠保證網(wǎng)絡環(huán)境下的主鍵唯一性,也就能夠保證在不同數(shù)據(jù)庫及不同服務器下主鍵的唯一性。特點;能夠保證數(shù)據(jù)庫中的主鍵唯一性,生成的主鍵占用比較多的存貯空間Foreign GUIDForeign用于一對一關系中。GUID主鍵生成方式使用了一種特殊算法,保證生成主鍵的唯一性,支持SQL Server和MySQL 13. Hibernate源碼中幾個包的作用簡要介紹net.sf.hibernate.* 該包的類基本上都是接口類和異常類 net.sf.hibernate.cache.* JCS的實現(xiàn)類 net.sf.hibernate.cfg.* 配置文件讀取類 net.sf.hibernate.collection.* Hibernate集合接口實現(xiàn)類,例如List,Set,Bag等等,Hibernate之所以要自行編寫集合接口實現(xiàn)類是為了支持lazy loading net.sf.hibernate.connection.* 幾個數(shù)據(jù)庫連接池的Provider net.sf.hibernate.dialect.* 支持多種數(shù)據(jù)庫特性,每個Dialect實現(xiàn)類代表一種數(shù)據(jù)庫,描述了該數(shù)據(jù)庫支持的數(shù)據(jù)類型和其它特點,例如是否有AutoIncrement,是否有Sequence,是否有分頁sql等等 net.sf.hibernate.eg.* Hibernate文檔中用到的例子 net.sf.hibernate.engine.* 這個包的類作用比較散 net.sf.hibernate.expression.* HQL支持的表達式 net.sf.hibernate.hq.* HQL實現(xiàn) net.sf.hibernate.id.* ID生成器 net.sf.hibernate.impl.* 最核心的包,一些重要接口的實現(xiàn)類,如果Session,SessionFactory,Query等 net.sf.hibernate.jca.* JCA支持,把Session包裝為支持JCA的接口實現(xiàn)類net.sf.hibernate.jmx.* 我不懂JMX,只知道JMX是用來編寫App Server的管理程序的,大概是JMX部分接口的實現(xiàn),使得App Server可以通過JMX接口管理Hibernate net.sf.hibernate.loader.* 也是很核心的包,主要是生成sql語句的 net.sf.hibernate.lob.* Blob和Clob支持 net.sf.hibernate.mapping.* hbm文件的屬性實現(xiàn) net.sf.hibernate.metadata.* PO的Meta實現(xiàn) net.sf.hibernate.odmg.* ODMG是一個ORM標準,這個包是ODMG標準的實現(xiàn)類 net.sf.hibernate.persister.* 核心包,實現(xiàn)持久對象和表之間的映射 xy.* 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實現(xiàn)類 net.sf.hibernate.type.* Hibernate中定義的持久對象的屬性的數(shù)據(jù)類型 net.sf.hibernate.util.* 一些工具類,作用比較散 net.sf.hibernate.xml.* XML數(shù)據(jù)綁定 14. 緩存管理Hibernate 中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬于事務范圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬于進程范圍或群集范圍的緩存。這一級別的緩存可以進行配置和更改,并且可以動態(tài)加載和卸載。 Hibernate還為查詢結果提供了一個查詢緩存,它依賴于第二級緩存。1. 一級緩存和二級緩存的比較:第一級緩存 第二級緩存 存放數(shù)據(jù)的形式 相互關聯(lián)的持久化對象 對象的散裝數(shù)據(jù) 緩存的范圍 事務范圍,每個事務都有單獨的第一級緩存進程范圍或集群范圍,緩存被同一個進程或集群范圍內(nèi)的所有事務共享 并發(fā)訪問策略由于每個事務都擁有單獨的第一級緩存,不會出現(xiàn)并發(fā)問題,無需提供并發(fā)訪問策略由于多個事務會同時訪問第二級緩存中相同數(shù)據(jù),因此必須提供適當?shù)牟l(fā)訪問策略,來保證特定的事務隔離級別 數(shù)據(jù)過期策略沒有提供數(shù)據(jù)過期策略。處于一級緩存中的對象永遠不會過期,除非應用程序顯式清空緩存或者清除特定的對象必須提供數(shù)據(jù)過期策略,如基于內(nèi)存的緩存中的對象的最大數(shù)目,允許對象處于緩存中的最長時間,以及允許對象處于緩存中的最長空閑時間 物理存儲介質(zhì)內(nèi)存內(nèi)存和硬盤。對象的散裝數(shù)據(jù)首先存放在基于內(nèi)在的緩存中,當內(nèi)存中對象的數(shù)目達到數(shù)據(jù)過期策略中指定上限時,就會把其余的對象寫入基于硬盤的緩存中。緩存的軟件實現(xiàn) 在Hibernate的Session的實現(xiàn)中包含了緩存的實現(xiàn)由第三方提供,Hibernate僅提供了緩存適配器(CacheProvider)。用于把特定的緩存插件集成到Hibernate中。啟用緩存的方式只要應用程序通過Session接口來執(zhí)行保存、更新、刪除、加載和查詢數(shù)據(jù)庫數(shù)據(jù)的操作,Hibernate就會啟用第一級緩存,把數(shù)據(jù)庫中的數(shù)據(jù)以對象的形式拷貝到緩存中,對于批量更新和批量刪除操作,如果不希望啟用第一級緩存,可以繞過Hibernate API,直接通過JDBCAPI來執(zhí)行指操作。用戶可以在單個類或類的單個集合的粒度上配置第二級緩存。如果類的實例被經(jīng)常讀但很少被修改,就可以考慮使用第二級緩存。只有為某個類或集合配置了第二級緩存,Hibernate在運行時才會把它的實例加入到第二級緩存中。 用戶管理緩存的方式第一級緩存的物理介質(zhì)為內(nèi)存,由于內(nèi)存容量有限,必須通過恰當?shù)臋z索策略和檢索方式來限制加載對象的數(shù)目。Session的evit()方法可以顯式清空緩存中特定對象,但這種方法不值得推薦。 第二級緩存的物理介質(zhì)可以是內(nèi)存和硬盤,因此第二級緩存可以存放大量的數(shù)據(jù),數(shù)據(jù)過期策略的maxElementsInMemory屬性值可以控制內(nèi)存中的對象數(shù)目。管理第二級緩存主要包括兩個方面:選擇需要使用第二級緩存的持久類,設置合適的并發(fā)訪問策略:選擇緩存適配器,設置合適的數(shù)據(jù)過期策略。2. 一級緩存的管理: 當應用程序調(diào)用Session的save()、update()、savaeOrUpdate()、get()或load(),以及調(diào)用查詢接口的 list()、iterate()或filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據(jù)緩存中對象的狀態(tài)變化來同步更新數(shù)據(jù)庫。 Session為應用程序提供了兩個管理緩存的方法: evict(Object obj):從緩存中清除參數(shù)指定的持久化對象。 clear():清空緩存中所有持久化對象。3. 二級緩存的管理:3.1. Hibernate的二級緩存策略的一般過程如下:1) 條件查詢的時候,總是發(fā)出一條select * from table_name where . (選擇所有字段)這樣的SQL語句查詢數(shù)據(jù)庫,一次獲得所有的數(shù)據(jù)對象。2) 把獲得的所有數(shù)據(jù)對象根據(jù)ID放入到第二級緩存中。3) 當Hibernate根據(jù)ID訪問數(shù)據(jù)對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查;查不到,再查詢數(shù)據(jù)庫,把結果按照ID放入到緩存。4) 刪除、更新、增加數(shù)據(jù)的時候,同時更新緩存。 Hibernate的二級緩存策略,是針對于ID查詢的緩存策略,對于條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query Cache。3.2. 什么樣的數(shù)據(jù)適合存放到第二級緩存中? 1 很少被修改的數(shù)據(jù) 2 不是很重要的數(shù)據(jù),允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù) 3 不會被并發(fā)訪問的數(shù)據(jù) 4 參考數(shù)據(jù),指的是供應用參考的常量數(shù)據(jù),它的實例數(shù)目有限,它的實例會被許多其他類的實例引用,實例極少或者從來不會被修改。3.3. 不適合存放到第二級緩存的數(shù)據(jù)? 1 經(jīng)常被修改的數(shù)據(jù) 2 財務數(shù)據(jù),絕對不允許出現(xiàn)并發(fā) 3 與其他應用共享的數(shù)據(jù)。3.4. 常用的緩存插件 Hibernater 的二級緩存是一個插件,下面是幾種常用的緩存插件:EhCache:可作為進程范圍的緩存,存放數(shù)據(jù)的物理介質(zhì)可以是內(nèi)存或硬盤,對Hibernate的查詢緩存提供了支持。OSCache:可作為進程范圍的緩存,存放數(shù)據(jù)的物理介質(zhì)可以是內(nèi)存或硬盤,提供了豐富的緩存數(shù)據(jù)過期策略,對Hibernate的查詢緩存提供了支持。SwarmCache:可作為群集范圍內(nèi)的緩存,但不支持Hibernate的查詢緩存。JBossCache:可作為群集范圍內(nèi)的緩存,支持事務型并發(fā)訪問策略,對Hibernate的查詢緩存提供了支持。3.5. 配置二級緩存的主要步驟:1) 選擇需要使用二級緩存的持久化類,設置它的命名緩存的并發(fā)訪問策略。這是最值得認真考慮的步驟。2) 選擇合適的緩存插件,然后編輯該插件的配置文件。Spring1. 你一般用spring做什么?控制反轉(zhuǎn)IOC AOP2. spring中

溫馨提示

  • 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

提交評論