1 Action是不是線程安全的?如果不是有什么方式可以保證Action的線程安全?如果是,說明原因
不是線程安全的。只要不申明類變量就可以保證線程安全。因為只存在一個Action實例,所有線程會共享變量。
聲明局部變量,或者擴展RequestProcessor,讓每次都創(chuàng)建一個Action,或者在spring中用scope="prototype"來管理
2.MVC,分析一下struts是如何實現(xiàn)MVC的
m:JavaBean 或結(jié)合 EJB 組件或者pojo構(gòu)成
c:ActionServlet 、action來實現(xiàn)
v:一組 JSP 文件及其標簽構(gòu)成。
3.struts中的幾個關(guān)鍵對象的作用(說說幾個關(guān)鍵對象的作用)
Action:控制器類,ActionForm:表單對象,DynaValidatorForm:動態(tài)form,ActonMapping:配置文件中action節(jié)點的信息......
4.說說AOP和IOC的概念以及在spring中是如何應(yīng)用的
AOP:面向切面編程,ioc:依賴注入;聲明式事務(wù)和編程式事務(wù)積極一些通用部分
5.Hibernate有哪幾種查詢數(shù)據(jù)的方式
hql查詢,sql查詢,qbc條件查詢
6.load()和get()的區(qū)別
hibernate對于load方法認為該數(shù)據(jù)在數(shù)據(jù)庫中一定存在,可以放心的使用代理來延遲加載,load()默認支持延遲加載,在用到對象中的其他屬性數(shù)據(jù)時才查詢數(shù)據(jù)庫,但是萬一數(shù)據(jù)庫中不存在該記錄,只能拋異常ObjectNotFoundEcception;所說的load方法拋異常是指在使用該對象的數(shù)據(jù)時,數(shù)據(jù)庫中不存在該數(shù)據(jù)時拋異常,而不是在創(chuàng)建這個對象時。由于session中的緩存對于hibernate來說是個相當廉價的資源,所以在load時會先查一下session緩存看看該id對應(yīng)的對象是否存在,不存在則創(chuàng)建代理(load時候之查詢一級緩存,不存在則創(chuàng)建代理)。get()首先會在一級緩存找數(shù)據(jù),沒有就去二級緩存找,沒有就去數(shù)據(jù)庫找,沒有就返回null ;而對于get方法,hibernate一定要獲取到真實的數(shù)據(jù),否則返回null。
簡單地說:如果查詢不到數(shù)據(jù)load()會拋異常,get()會返回null。
7.談?wù)刪ibernate的延遲加載和openSessionInView
延遲加載要在session范圍內(nèi),用到的時候再加載;openSessionInBiew是在web層寫了一個
filter來打開和關(guān)閉session,這樣就表示在一次request過程中session一直開著,保證了延遲
加載在session中的這個前提。
8.spring的事務(wù)有幾種方式?談?wù)剆pring事務(wù)的隔離級別和傳播行為。
聲明式事務(wù)和編程式事務(wù)
隔離級別:
- DEFAULT使用數(shù)據(jù)庫默認的隔離級別
- READ_UNCOMMITTED會出現(xiàn)臟讀,不可重復(fù)讀和幻影讀問題
- READ_COMMITTED會出現(xiàn)重復(fù)讀和幻影讀
- REPEATABLE_READ會出現(xiàn)幻影讀
- SERIALIZABLE最安全,但是代價最大,性能影響極其嚴重
和傳播行:
- REQUIRED存在事務(wù)就融入該事務(wù),不存在就創(chuàng)建事務(wù)
- SUPPORTS存在事務(wù)就融入事務(wù),不存在則不創(chuàng)建事務(wù)
- MANDATORY存在事務(wù)則融入該事務(wù),不存在,拋異常
- REQUIRES_NEW總是創(chuàng)建新事務(wù)
- NOT_SUPPORTED存在事務(wù)則掛起,一直執(zhí)行非事務(wù)操作
- NEVER總是執(zhí)行非事務(wù),如果當前存在事務(wù)則拋異常
- NESTED嵌入式事務(wù)
9.Hibernate中的update()和saveOrUpdate()的區(qū)別.
saveOrUpdate()做下面的事:
如果對象已經(jīng)在本session中持久化了,不做任何事
如果另一個與本session關(guān)聯(lián)的對象擁有相同的持久化標識(identifier),拋出一個異常
如果對象沒有持久化標識(identifier)屬性,對其調(diào)用save()
如果對象的持久標識(identifier)表明其是一個新實例化的對象,對其調(diào)用save()
如果對象是附帶版本信息的(通過 <version>或 <timestamp>)并且版本屬性的值表明其是一個新實例化的對象,save()它。否則update() 這個對象
10.Spring對多種ORM框架提供了很好的支持,簡單描述在Spring中使用Hibernate的方法,并結(jié)合事務(wù)管理。(常用)
getHiberanteTemplate里面提供了save,update,delete,find等方法。
簡單說一個:如果配置了聲明式事務(wù),當執(zhí)行g(shù)etHibernateTemplate的各種方法的時候,事務(wù)會
自動被加載
如果沒有配置事務(wù),那么以上操作不會真正的被同步到數(shù)據(jù)庫,除非配置了hibernate的
autocommit=true
8.spring的事務(wù)有幾種方式?談?wù)剆pring事務(wù)的隔離級別和傳播行為。
spring事務(wù)分兩種形式,聲明式事務(wù)和編程式事務(wù),spring提供了一個事務(wù)的接口
PaltformTractionManager接口,針對不同的事務(wù),spring進行了不同的實現(xiàn),對hibernate事務(wù)
的實現(xiàn)HIbernateTractionManager,對JDBC的JdbcTractionManager,
DataSourceTractionManager以及JdoTractionManager。接口platformTractionManager提供了三
個方法,獲取事務(wù),提交和回滾的方法。