在面試中一般面試官會根據面試者的簡歷來提問題,如果你的項目有用到ssh的話那麼這篇文章也許會對你有幫助。當然,面試題目並不是速成法,如果你對這方面不太瞭解,建議你看我的另外一篇博客點我看基礎接下來是我自己總結的一些ssh的面試題集合。
Struts面試題
談談你對mvc的理解
MVC是Model-View-Controler的簡稱。即模型-視圖-控制器。MVC是一種設計模式,它強制性的把應用程序的輸入.處理和輸出分開。
MVC中的模型,視圖.控制器他們分別擔任着不同的任務。
視圖:視圖是用戶看到並與之交互的界面。視圖向用戶顯示相關的數據,並接受用戶的輸入。視圖不進行任何業務邏輯處理。
模型: 模型表示業務數據和業務處理。相當於JavaBean。一個模型能爲多個視圖提供數據。這提高了應用程序的重用性。
控制器:當用戶單擊web頁面中的提交按鈕時,控制器接受請求並調用相應的模型去處理請求。然後根據處理的結果調用相應的視圖來顯示處理的結果。
MVC處理過程:首先控制器接受用戶請求,調用相應的模型
來進行業務處理,並返回數據給控制器,控制器調用相應的視圖來顯示處理的結果。並通過視圖呈現給用戶
說下Struts的設計模式
MVC模式: web應用程序啓動時就會加載並初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創建,並被填入表單相應的數據,ActionServler根據Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的Validate()驗證後選擇將請求發送到哪個Action,如果Action不存在,ActionServlet會先創建這個對象,然後調用Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態的網頁,返回給客戶。
Struts2.0常用標籤
- 往action裏傳值:
<input name="userName" type="text" class="input6" size="15">
- 顯示標籤 property 用於輸出指定值:
<s:property value="userName "/>
- 用於從頁面往action中(user)的對象內傳值:
<s:text name="user.userName " id="username"/>
- 判斷<s:if> </s:if> 用於在頁面中判斷指定數據
<s:if test="userName == admin">…. </s:if> <s:else>…. </s:else>
- 迭代<s:iterator>用於將List、Map、ArrayList等集合進行循環遍
歷
<s:iterator value="userList" id="user" status="u">
<s:property value="userName"/></a>
</s:iterator>
- URL地址標籤,<s:url>用於生成一個URL地址,可以通過URL標籤指定的<s:param>子元素向URL地址發送請求參數
<s:url action=" ">
<s:param name=" " value=""></s:param>
</s:url>
<a href="
<s:url action=" ">
<s:param name=" " value=""></s:param>
<s:param name=" " value=""></s:param>
<s:param name=" " value=""></s:param>
</s:url>
">超鏈接</a>
- set標籤,用於將某個值放入指定的範圍內。例如application,session等。
<s:set name="user" value="userName" scope=”request”/>
Struts如何實現國際化
以下以兩國語言(中文,英文)爲例:
1. 在工程中加入Struts支持
2. 編輯ApplicationResource.properties文件,在其中加入要使用國際化的信息, 例如: lable.welcome.china=Welcome!!!
3. 創建英文資源文件ApplicationResource_en.properites
4. 創建臨時中文資源文件ApplicationResource_temp.properites 例如:lable.welcom.china=中國歡迎您!
5. 對臨時中文資源文件進行編碼轉換。可以使用myeclipse的插件,也可以在dos下執行:
native2ascii -encoding gb2312 ApplicationResource_temp.properties ApplicationResource_zh_CN.properties
6.在jsp中加入struts的bean標記庫 <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix=“bean”%>
顯示信息: <bean:message key=“label.welcome.china”>
可以在struts-config.xml文件中定義多個資源包,而每個資源包可使用key屬性指定包的名稱
Struts1.x工作機制?
工作機制:
Struts的工作流程:
在web應用啓動時就會加載初始化ActionServlet,ActionServlet從
struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象
當ActionServlet接收到一個客戶請求時,將執行如下流程.
-(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息;
-(2)如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;
-(3)根據配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法;
-(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功;
-(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發給哪個Action,如果相應的 Action實例不存在,就先創建這個實例,然後調用Action的execute()方法;
-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發給 ActionForward對象指向的JSP組件;
-(7)ActionForward對象指向JSP組件生成動態網頁,返回給客戶;
struts中怎麼配置form-bean、action、tiles
此處配置的是struts1.2的
form-bean配置:(在配置文件struts-config.xml中):
<form-beans >
<form-bean name="" type=""></form-bean>
</form-beans>
name: 指定form的名字; type指定form的類型:包名+類名;
action配置:(在配置文件struts-config.xml中)
<action-mappings >
<action path=""
attribute=""
input=""
name=""
parameter=""
scope="request"
type=""
></action>
</action-mappings>
path:請求Action的名字; attribute:form的名字,與form-bean中的name對應; input:輸入頁的路徑;
name:如果配置了attribute,name不起作用,與attribute一樣; parameter:使用分發Action時,指定調用分發Action中的 方法名;
scope:Action的範圍; type:Action的類型:包名+類名;
tites配置:
- 新建一個 tiles-defs.xml文件,並在其中做如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
<definition name="member-definition" path="/Jsp/layout.jsp">
<put name="top" value="/mTop.do"/>
<put name="left" value="/mLeft.do"/>
<put name="main" value="/defaultMmain.do"/>
</definition>
</tiles-definitions>
-
在web.xml和struts-config.xml和web.xml中做相應配置:
在struts-config.xml中配置如下
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>
<set-property property="definitions-parser-validate" value="true"/>
</plug-in>
在web.xml中配置如下:
<init-param>
<param-name>definitions-config</param-name>
<param-value>/WEB-INF/tiles-defs.xml</param-value>
</init-param>
-
調用Tiles組件
Tiles組件是通過Struts Action來調用的,在struts-config.xml中做如下action配置
<action
path="/member"
parameter="member-definition"
type="org.apache.struts.actions.ForwardAction"/>
action是單實例還是多實例,爲什麼?
action是單實例的。當多個用戶訪問一個請求的時候,服務器內存中只有一個與之對應的action類對象。
因爲當服務器第一次加載struts的配置文件的時候,創建了一個Action後,每發送一個請求,服務器都會先去檢索相應的範圍內(request,session)是否存在
這樣一個action實例,如果存在,則使用這個實例,如果不存在,則創建一個action實例。
struts2.0的mvc模式?與struts1.0的區別?
struts2的mvc模式:當用戶在頁面提交用戶請求時,該請求需要提交給struts2的控制器處理。struts2的控制器根據處理結果,
決定將哪個頁面呈現給客戶端。
與struts1最大的不同是:struts2的控制器。struts2的控制器不再像struts1的控制器,需要繼承一個Action父類,甚至可以無需實現
任何接口,struts2的Action就是一個普通的POJO。實際上,Struts2 的Action就是一個包含execute方法的普通Java類
該類裏包含的多個屬性用於封裝用戶的請求參數。
struts的處理流程
一、ActionServlet的初始化
ActionServlet作爲Struts組件的前端控制器,由於web.xml的相應配置:
<load-on-startup>0</load-on-startup>
在應用一加載時即會被實例化並調用其init方法,init方法所做的主要工作有二:
- 加載struts配置文件,並創建用於封裝配置信息的ModuleConfig對象
- 加載資源文件,並創建用於封裝資源文件的MessageResources對象需要注意兩點:如果web.xml有多模塊配置,將創建多個ModuleConfig對象和MessageResources對象分別用於封裝各個模塊的struts配置文件和資源文件。針對各個模塊所創建的ModuleConfig對象和MessageResources對象將存儲在ServletContext中,對應的屬性名中有該模塊名稱的相應標識。
另外,如果有相應配置的話,init方法還將初始化數據源和PlugIn
二、ActionServlet的process
所有形如*.do的請求(根據web.xml中的相關配置)將提交給ActionServlet,最終將調用其process方法
。process方法的主要工作有三:
1.根據請求信息獲知所請求的模塊名稱,從ServletContext中獲得與請求模塊對應的的ModuleConfig對象,並存儲到request中。
2.根據模塊信息獲得相應的RequestProcessor對象,一個模塊對應一個RequestProcessor對象,RequestProcessor對象將關聯與所屬模塊對應的ModuleConfig對象。
3.調用RequestProcessor對象的process方法,將request和response作爲參數傳遞給它。
三、RequestProcessor的process
RequestProcessor對象的process方法的主要工作有五步:
1.調用自己的 processPreprocess(request, response)方法,該方法不進行任何操作,用於子類重寫擴展其功能。
2.獲得與請求地址所匹配的ActionMapping對象,AcionMapping對象用於封裝一個特定acion的配置信息。
3.根據ActionMapping中的配置信息獲得ActionForm對象(該對象將緩存到request或session中),並將表單數據填充到ActionForm中,然後根據ActionMapping的配置決定是否驗證ActionForm,如果驗證,將調用ActionForm的 validate方法,若其返回的ActionErros對象中包含ActionMessage對象則表示驗證
失敗,將轉向action配置信息 input屬性所指示的地址。
4.如果ActionForm無需驗證或驗證通過將創建並緩存與請求地址匹配的Action對象,將ActionMapping對象、ActionForm對象、request和response作爲參數調用其execute方法。
5.根據Action對象的execute方法返回的ActionForward對象,將請求轉發或重定向到該ActionForward所封裝的地址。
Struts/webwork 的工作機制,它有哪些標籤
Struts 2框架的大致處理流程如下:
瀏覽器發送請求,例如請求/mypage.action、/reports/myreport.pdf等。
核心控制器FilterDispatcher根據請求決定調用合適的Action。
WebWork的攔截器鏈自動對請求應用通用功能,例如workflow、validation或文件上傳等功能。
回調Action的execute方法,該execute方法先獲取用戶請求參數,然後執行某種數據庫操作,既可以是將數據保存到數據庫,也可以從數據庫中檢索信息。實際上,因爲Action只是一個控制器,它會調用業務邏輯組件來處理用戶的請求。
Action的execute方法處理結果信息將被輸出到瀏覽器中,可以是HTML頁面、圖像,也可以是PDF文檔或者其他文檔。此時支持的視圖技術非常多,既支持JSP,也支持Velocity、FreeMarker等模板技術。
Spring部分
Spring工作機制
1.spring mvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模塊負責負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請請求提交到目標Controller
4.Controller進行業務邏輯處理後,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給客戶端。
##使用Spring的好處
AOP 讓開發人員可以創建非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務 (比 如日誌、持久性、事務等)就可以分解成方面並應用到域對象上,同時不會增加域對象的對象模型的複雜性。
<bean id = "proxy" type = "org.spring.framework.aop.ProxyBeanFacory">
<property name = "target" ref = ""></property>
<property name = "advisor" ref = ""></property>
</bean>
IOC 允許創建一個可以構造對象的應用環境,然後向這些對象傳遞它們的協作對象。正如單詞 倒置 所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。
Spring即是一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協作對象)。然後可以很容易地在需要時替換具有類似接口的協作對象。
Spring是什麼?根據你的理解詳細談談你的見解
◆目的:解決企業應用開發的複雜性
◆功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能
◆範圍:任何Java應用
簡單來說,Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架。
◆輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR文件裏發佈。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類。
◆控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你可以認爲IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
◆面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務()管理)進行內聚性的開發。應用對象只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。
◆容器——Spring包含並管理應用對象的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創建——基於一個可配置原型(prototype),你的bean可以創建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。
◆框架——Spring可以將簡單的組件配置、組合成爲複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件裏。Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。
所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的代碼。它們也爲Spring中的各種模塊提供了基礎支持。
spring在項目中如何充當粘合劑
1、在項目中利用spring的IOC(控制反轉或依賴注入),明確地定義組件接口(如UserDAO),開發者可以獨立開發各個組件, 然後根據組件間的依賴關係組裝(UserAction依賴於UserBiz,UserBiz依賴於UserDAO)運行,很好的把Struts(Action)和hibernate(DAO的實現)結合起來了。
2、spring的事務管理把hibernate對數據庫的操作進行了事務配置。
spring的事務如何配置
spring的聲明式事務配置:
1. <!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>/WEB-INF/classes/hibernate.cfg.xml</value>
</property>
</bean>
2. 配置事務管理器
<!-- 配置事務管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
3. 配置事務特性
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
4. 配置哪些類的哪些方法配置事務
<aop:config>
<aop:pointcut id="allManagerMethod" ession="execution(* com.yyaccp.service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod">
</aop:config>
transaction有那幾種實現
在Spring中,事務處理主要有兩種方式
(1) 代碼控制事務
在程序中引入新的模版類,這個類封裝了事務管理的功能
(2) 參數配置控制事務,在Application-Context.xml增加一個事務代理(UserDAOProxy)配置
IBATIS中的事物屬性怎麼配置
SQL MAP XML配置文件中的transactionManager
Hibernate面試題
Hibernate工作原理
1.讀取並解析配置文件
2.讀取並解析映射信息,創建SessionFactory
3.打開Sesssion
4.創建事務Transation
5.持久化操作
6.提交事務
7.關閉Session
8.關閉SesstionFactory
什麼是Hibernate的併發機制?怎麼處理併發問題?
Hibernate併發機制:
a、Hibernate的Session對象是非線程安全的,對於單個請求,單個會話,單個的工作單元(即單個事務,單個線程),它通常只使用一次,然後就丟棄。如果一個Session 實例允許共享的話,那些支持併發運行的,例如Http request,session beans將會導致出現資源爭用。如果在Http Session中有hibernate的Session的話,就可能會出現同步訪問Http Session。只要用戶足夠快的點擊瀏覽器的“刷新”,就會導致兩個併發運行的線程使用同一個Session。
b、多個事務併發訪問同一塊資源,可能會引發第一類丟失更新,髒讀,幻讀,不可重複讀,第二類丟失更新一系列的問題。
解決方案:設置事務隔離級別。
Serializable:串行化。隔離級別最高
Repeatable Read:可重複讀
Read Committed:已提交數據讀
Read Uncommitted:未提交數據讀。隔離級別最差
設置鎖:樂觀鎖和悲觀鎖。
樂觀鎖:使用版本號或時間戳來檢測更新丟失,在的映射中設置 optimistic-lock="all"可以在沒有版本或者時間戳屬性映射的情況下實現 版本檢查,此時Hibernate將比較一行記錄的每個字段的狀態
行級悲觀鎖:Hibernate總是使用數據庫的鎖定機制,從不在內存中鎖定對象!只要爲JDBC連接指定一下隔 離級別,然後讓數據庫去搞定一切就夠了。類LockMode 定義了Hibernate所需的不同的鎖定級別:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;
Hibernate自帶的分頁機制是什麼?如果不使用Hibernate自帶的分頁,則採用什麼方式分頁?
1、hibernate自帶的分頁機制:獲得Session對象後,從Session中獲得Query對象。用Query.setFirstResult():設置要顯示的第一行數據Query.setMaxResults():設置要顯示的最後一行數據。
2、不使用hibernate自帶的分頁,可採用sql語句分頁,
如:5:爲每頁顯示的記錄,2爲當前頁: select * top 5 from table where tabId not in (select tabId top (2-1)*5 from table);
hibernate的三種狀態之間如何轉換
當對象由瞬時狀態(Transient)一save()時,就變成了持久化狀態。 當我們在Session裏存儲對象的時候,實際是在Session的Map裏存了一份, 也就是它的緩存裏放了一份,然後,又到數據庫裏存了一份,在緩存裏這一份叫持久對象(Persistent)。
Session 一 Close()了,它的緩存也都關閉了,整個Session也就失效了, 這個時候,這個對象變成了遊離狀態(Detached),但數據庫中還是存在的。當遊離狀態(Detached)update()時,又變爲了持久狀態(Persistent)。當持久狀態(Persistent)delete()時,又變爲了瞬時狀態(Transient),此時,數據庫中沒有與之對應的記錄。
update()和saveOrUpdate()的區別?
update()和saveOrUpdate()是用來對跨Session的PO進行狀態管理的,update()方法操作的對象必須是持久化了的對象。也就是說,如果此對象在數據庫中不存在的話,就不能使用update()方法。
saveOrUpdate()方法操作的對象既可以使持久化了的,也可以使沒有持久化的對象。如果是持久化了的對象調用saveOrUpdate()則會 更新數據庫中的對象;如果是未持久化的對象使用此方法,則save到數據庫中。
hibernate拒絕連接、服務器崩潰的原因?最少寫5個
-
db沒有打開
-
網絡連接可能出了問題
-
連接配置錯了
-
驅動的driver,url是否都寫對了
-
LIB下加入相應驅動,數據連接代碼是否有誤
-
數據庫配置可能有問題
-
當前聯接太多了,服務器都有訪問人數限制的
-
服務器的相應端口沒有開,即它不提供相應的服務
-
hibernate有哪些緩存,分別怎麼使用?
-
你對hibernate的瞭解到了一個什麼樣的程度?
-
寫出一個sql語句體現hibernate中一對多的關係
hibernate如何管理緩存
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) 選擇合適的緩存插件,然後編輯該插件的配置文件。
使用Hibernate的優點:
-
對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。
-
Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作
-
hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。
-
hibernate的性能非常好,因爲它是個輕量級框架。映射的靈活性很出色。它支持各種關係數據庫,從一對一到多對多的各種複雜關係。
Hibernate是如何延遲加載?
-
Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)
-
Hibernate3 提供了屬性的延遲加載功能
當Hibernate在查詢數據的時候,數據並沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。
如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
-
繼承類使用顯式多態
-
表字段要少,表關聯不要怕多,有二級緩存撐腰
綜合考察
Hibernate和spring中常出現的幾個異常
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同時對應數據庫表中的password一列,同時password裏面的update和insert都設爲true。xml文件如下:
<property name="password"
type="java.lang.String"
update="true"
insert="true"
access="property"
column="password"
length = "32"
/>
<property name="repassword"
type="java.lang.String"
update="false"
insert="false"
access="property"
column="password"
length = "32"
/>
解決方法:將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改稱小寫。
Hibernate與jdbc的聯繫
hibernate是jdbc的輕量級封裝,包括jdbc的與數據庫的連接(用hibernate.property的配置文件實現當然本質是封裝了jdbc的forname),和查詢,刪除等代碼,都用面向對象的思想用代碼聯繫起來,hibernate通過hbm 配置文件把po類的字段和數據庫的字段關聯起來比如數據庫的id, 在po類中就是pravite Long id; public Long getId() ;public setId(Long id);然後hql語句也是面向對象的,它的查詢語句不是查詢數據庫而是查詢類的,這些實現的魔法就是xml文件,其實hibernate=封裝的jdbc+xml文件。
Hibernate與spring的聯繫
hibernate中的一些對象可以給Spring來管理,讓Spring容器來創建hibernate中一些對象實例化。例如:SessionFactory,HibernateTemplate等。
Hibernate本來是對數據庫的一些操作,放在DAO層,而Spring給業務層的方法定義了事務,業務層調用DAO層的方法,很好的將Hibernate的操作也加入到事務中來了。
項目中爲什麼使用SSH
-
使用Struts是因爲struts是基於MVC模式的,很好的將應用程序進行了分層,使開發者更關注於業務邏輯的實現;第二,struts有着豐富的taglib,如能靈活運用,則能大大提高開發效率。
-
使用Hibernate:因爲hibernate爲Java應用提供了一個易用的、高效率的對象關係映射框架。hibernate是個輕量級的持久性框架,功能豐富。
-
使用Spring:因爲spring基於IoC(Inversion of Control,反向控制)和AOP構架多層j2ee系統的框架,但它不強迫你必須在每一層中必須使用Spring,因爲它模塊化的很好,允許你根據自己的需要選擇使用它的某一個模塊;
-
採用IoC使得可以很容易的實現bean的裝配,提供了簡潔的AOP並據此實現事務管理(Transcation Managment),等等