撩課-Java每天5道面試題第15天
摘要:
撩課Java+系統架構點選開始學習
106.什麼是Hibernate的併發機制?怎麼去處理併發問題?
a、Hibernate的Session物件是非執行緒安全的,
對於單個請求,單個會話,
單個的工作單元(即單個事務,單個執行緒),
它通常只使用一次...
ofollow,noindex">撩課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的效能非常好, 因為它是個輕量級框架。 對映的靈活性很出色。 它支援各種關係資料庫, 從一對一到多對多的各種複雜關係。