1. 程式人生 > >java SSM面試題

java SSM面試題

close inversion logic 生命 回調 簡單的 obj mar sele

1. 談談你mvc的理解
MVC是Model—View—Controler的簡稱。即模型—視圖—控制器。MVC是一種設計模式,它強制性的把應用程序的輸入、處理和輸出分開。MVC中的模型、視圖、控制器它們分別擔負著不同的任務。
(1)視圖: 視圖是用戶看到並與之交互的界面。視圖向用戶顯示相關的數據,並接受用戶的輸入。視圖不進行任何業務邏輯處理。
(2)模型: 模型表示業務數據和業務處理。相當於JavaBean。一個模型能為多個視圖提供數據。這提高了應用程序的重用性
(3)控制器: 當用戶單擊Web頁面中的提交按鈕時,控制器接受請求並調用相應的模型去處理請求。然後根據處理的結果調用相應的視圖來顯示處理的結果。
MVC的處理過程:首先控制器接受用戶的請求,調用相應的模型來進行業務處理,並返回數據給控制器。控制器調用相應的視圖來顯示處理的結果。並通過視圖呈現給用戶。



2. 項目中為什麽使用SSH
(1) 使用Struts2是因為struts2是基於MVC模式的,很好的將應用程序進行了分層,使開發者更關註於業務邏輯的實現;第二,struts有著豐富的taglib,如能靈活運用,則能大大提高開發效率。
(2)使用Hibernate:因為hibernate為Java應用提供了一個易用的、高效率的對象關系映射框架。hibernate是個輕量級的持久性框架,功能豐富。
(3)使用Spring:因為spring基於IoC(Inversion of Control,反向控制)和AOP構架多層j2ee系統的框架,但它不強迫你必須在每一層中必須使用Spring,因為它模塊化的很好,允許你根據自己的需要選擇使用 它的某一個模塊;采用IoC使得可以很容易的實現bean的裝配,提供了簡潔的AOP並據此實現事務管理(Transcation Managment),等等


3. 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"%>
顯示信息:
可以在struts-config.xml文件中定義多個資源包,而每個資源包可使用key屬性指
定包的名稱。


7. 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標簽。

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

9. 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的這麽
一個技術。

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

11. STRUTS的配置文件是什麽?
struts-config.xml

12. 請寫出Struts的工作原理。

13. struts的處理流程。
一、ActionServlet的初始化
ActionServlet作為Struts組件的前端控制器,由於web.xml的相應配置:
0
在應用一加載時即會被實例化並調用其init方法,init方法所做的主要工作有二:
1. 加載struts配置文件,並創建用於封裝配置信息的ModuleConfig對象
2. 加載資源文件,並創建用於封裝資源文件的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
所封裝的地址。




16. 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等模板技術。

Hibernate
1. 什麽是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;

2. 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一列,同時
update和insert都設為true。xml文件如下:

type="java.lang.String"
update="true"
insert="true"
access="property"
column="password"
length = "32"
/> 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改
稱小寫。

3. 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文件

4. Hibernate與spring的聯系
hibernate中的一些對象可以給Spring來管理,讓Spring容器來創建hibernate中一
些對象實例化。例如:SessionFactory,HibernateTemplate等。
Hibernate本來是對數據庫的一些操作,放在DAO層,而Spring給業務層的方法定義了
事務,業務層調用DAO層的方法,很好的將Hibernate的操作也加入到事務中來了。

5. 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);

6. hibernate的對象的三種持久化狀態,並給出解釋?
不清楚hibernate的對象的三種持久化狀態,只知道hibernate對象的三種狀態,下面
有介紹。

7. hibernate中一對多配置文件返回的是什麽?
hibernate中一對多配置文件會相應的映射為兩張表,並且它們之間的關系是一對
多的。
例如:一個student和classes表的關系 。一個學生只能是一個班的,一個班可以有
多個學生。

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

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

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


11. 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語句兩種表達方式。
12. Hibernate主鍵介紹
  Assigned
  Assigned方式由程序生成主鍵值,並且要在save()之前指定否則會拋出異常
  特點:主鍵的生成值完全由用戶決定,與底層數據庫無關。用戶需要維護主鍵
值,在調用session.save()之前要指定主鍵值。
  Hilo
  Hilo使用高低位算法生成主鍵,高低位算法使用一個高位值和一個低位值,然
後把算法得到的兩個值拼接起來作為數據庫中的唯一主鍵。Hilo方式需要額外的數
據庫表和字段提供高位值來源。默認請況下使用的表是
  hibernate_unique_key,默認字段叫作next_hi。next_hi必須有一條記錄否則
會出現錯誤。
  特點:需要額外的數據庫表的支持,能保證同一個數據庫中主鍵的唯一性,但
不能保證多個數據庫之間主鍵的唯一性。Hilo主鍵生成方式由Hibernate 維護,所
以Hilo方式與底層數據庫無關,但不應該手動修改hi/lo算法使用的表的值,否則
會引起主鍵重復的異常。
  Increment
  Increment方式對主鍵值采取自動增長的方式生成新的主鍵值,但要求底層數
據庫的支持Sequence。如Oracle,DB2等。需要在映射文件xxx.hbm.xml中加入
Increment標誌符的設置。
  特點:由Hibernate本身維護,適用於所有的數據庫,不適合多進程並發更新
數據庫,適合單一進程訪問數據庫。不能用於群集環境。
  Identity
  Identity當時根據底層數據庫,來支持自動增長,不同的數據庫用不同的主鍵
增長方式。
  特點:與底層數據庫有關,要求數據庫支持Identity,如MySQl中是
auto_increment, SQL Server 中是Identity,支持的數據庫有MySql、SQL
Server、DB2、Sybase和HypersonicSQL。 Identity無需Hibernate和用戶的幹涉,
使用較為方便,但不便於在不同的數據庫之間移植程序。
  Sequence
  Sequence需要底層數據庫支持Sequence方式,例如Oracle數據庫等
  特點:需要底層數據庫的支持序列,支持序列的數據庫有DB2、PostgreSql、
Qracle、SAPDb等在不同數據庫之間移植程序,特別從支持序列的數據庫移植到不
支持序列的數據庫需要修改配置文件
  Native
  Native主鍵生成方式會根據不同的底層數據庫自動選擇Identity、Sequence、
Hilo主鍵生成方式
  特點:根據不同的底層數據庫采用不同的主鍵生成方式。由於Hibernate會根
據底層數據庫采用不同的映射方式,因此便於程序移植,項目中如果用到多個數據
庫時,可以使用這種方式。
  UUID
  UUID使用128位UUID算法生成主鍵,能夠保證網絡環境下的主鍵唯一性,也就
能夠保證在不同數據庫及不同服務器下主鍵的唯一性。
  特點;能夠保證數據庫中的主鍵唯一性,生成的主鍵占用比較多的存貯空間
  Foreign GUID
  Foreign用於一對一關系中。GUID主鍵生成方式使用了一種特殊算法,保證生
成主鍵的唯一性,支持SQL Server和MySQL
13. 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數據綁定
14. 緩存管理
  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) 選擇合適的緩存插件,然後編輯該插件的配置文件。

Spring
1. 你一般用spring做什麽?
控制反轉IOC AOP
2. spring中的哪個類的哪個方法可用於獲取bean

3. spring是什麽?根據你的理解詳細談s談你的見解。
◆目的:解決企業應用開發的復雜性
  ◆功能:使用基本的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中的各種模塊提供了基礎支持。

4. 項目中如何體現Spring中的切面編程,距離說明。
面向切面編程:主要是橫切一個關註點,將一個關註點模塊化成一個切面。在切面
上聲明一個通知(Advice)和切入點(Pointcut); 通知: 是指在切面的某個特定的連
接點(代表一個方法的執行。通過聲明一個org.aspectj.lang.JoinPoint類型的參
數可以使通知(Advice)的主體部分獲得連接點信息。)上執行的動作。通知中定
義了要插入的方法。切入點:切入點的內容是一個表達式,以描述需要在哪些對象
的哪些方法上插入通知中定義的方法。
項目中用到的Spring中的切面編程最多的地方:聲明式事務管理。
a、定義一個事務管理器
b、配置事務特性(相當於聲明通知。一般在業務層的類的一些方法上定義事務)
c、配置哪些類的哪些方法需要配置事務(相當於切入點。一般是業務類的方法上)


6. spring在項目中如何充當粘合劑
1、在項目中利用spring的IOC(控制反轉或依賴註入),明確地定義組件接口(如
UserDAO),開發者可以獨立開發各個組件, 然後根據組件間的依賴關系組裝
(UserAction依賴於UserBiz,UserBiz依賴於UserDAO)運行,很好的把
Struts(Action)和hibernate(DAO的實現)結合起來了。
2、spring的事務管理把hibernate對數據庫的操作進行了事務配置。

7. spring的事務如何配置
spring的聲明式事務配置:
1.
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

/WEB-INF/classes/hibernate.cfg.xml
2. 配置事務管理器

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

8. transaction有那幾種實現(事務處理)(Spring)

在Spring中,事務處理主要有兩種方式
(1) 代碼控制事務
在程序中引入新的模版類,這個類封裝了事務管理的功能
(2) 參數配置控制事務,在Application-Context.xml增加一個事務代理
(UserDAOProxy)配置

java SSM面試題