撩課-Java天天5道面試題第15天

撩課Java+系統架構點擊開始學習

106.什麼是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;

 

107.update和saveOrUpdate的區別?

update()和saveOrUpdate()
是用來對跨Session的PO進行狀態管理的。 
update()方法操做的對象必須是持久化了的對象。
也就是說,若是此對象在數據庫中不存在的話,
就不能使用update()方法。 

saveOrUpdate()方法
操做的對象既能夠使持久化了的,
也能夠使沒有持久化的對象。
若是是持久化了的對象調用saveOrUpdate()
則會 更新數據庫中的對象;
若是是未持久化的對象使用此方法,
則save到數據庫中。

 

108.hibernate的三種狀態之間如何轉換

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

 

109.比較hibernate的三種檢索策略優缺點?

1當即檢索; 
優勢: 
對應用程序徹底透明,
無論對象處於持久化狀態,
仍是遊離狀態,
應用程序均可以方便的
從一個對象導航到與它關聯的對象; 
缺點:
 1.select語句太多;
2.可能會加載應用程序
不須要訪問的對象白白浪費許多內存空間; 

2延遲檢索: 
優勢:
由應用程序決定須要加載哪些對象,
能夠避免可執行多餘的select語句,
以及避免加載應用程序不須要訪問的對象。
所以能提升檢索性能,
而且能節省內存空間; 

缺點: 
應用程序若是但願訪問遊離狀態代理類實例,
必須保證他在持久化狀態時已經被初始化;
 
3 迫切左外鏈接檢索 
優勢: 1對應用程序徹底透明,
無論對象處於持久化狀態,
仍是遊離狀態,
應用程序均可以方便地衝
一個對象導航到與它關聯的對象。
2使用了外鏈接,
select語句數目少; 
缺點:
1 可能會加載應用程序不須要訪問的對象,
白白浪費許多內存空間;
2複雜的數據庫錶鏈接也會影響檢索性能;

 

110.Hibernate工做原理及爲何要用?

1.讀取並解析配置文件 
2.讀取並解析映射信息,建立SessionFactory 
3.打開Sesssion 
4.建立事務Transation 
5.持久化操做 
6.提交事務 
7.關閉Session 
8.關閉SesstionFactory

爲何要用: 
1. 對JDBC訪問數據庫的代碼作了封裝,
大大簡化了數據訪問層繁瑣的重複性代碼。

Hibernate是一個基於JDBC的主流持久化框架,
是一個優秀的ORM實現。
他很大程度的簡化DAO層的編碼工做

hibernate使用Java反射機制,
而不是字節碼加強程序來實現透明性。

hibernate的性能很是好,
由於它是個輕量級框架。
映射的靈活性很出色。
它支持各類關係數據庫,
從一對一到多對多的各類複雜關係。
 
相關文章
相關標籤/搜索