好程序員Java教程分享Java面試題之Hibernatejava
1.簡書一下Hibernated的開發流程程序員
第一步:加載Hibernate的配置文件,讀取配置文件的參數, 第二步:建立SessionFactory會話工廠(內部有鏈接池) 第三步:打開Session 鏈接 第四步:開啓事務 第五步:運行操做 第六步:提交事務 第七步:關閉session 第八步:關閉鏈接池
2.Hibernate 中對對象的三種狀態面試
瞬時狀態:不存在持久化標識的OID,還沒有與HibernateSession對象關聯,被認爲處於瞬時狀態,失去引用將被JVM回收 持久態:存在持久標識OID,與當前session有關聯,而且相關聯Session沒有關閉,而且事務未提交 遊離態:存在持久化標識OID,但沒有與當前Session關聯,
3.Hibernate的緩存機制數據庫
Hibernate緩存機制分爲兩層,Hibernate的一級緩存和Hibernate二級緩存。 1.Hibernate一級緩存(Session的緩存)
Session 實現了第一級Cache,屬於事務級數據緩衝,一旦事務結束,緩存隨之失效,一個Session的生命週期對應一個數據庫事務或一個程序事務。緩存
Session-Cache老是被打開而且不能被關閉的
Session-Cache 保證一個Session中兩次請求同一個對象時,取得的對象是一個Java實例,有時他能夠避免數據沒必要要的衝突安全
Hibernate 二級緩存(SessionFactory的緩存)session
(1)Hibernate 二級緩衝是SessionFactory範圍內的緩存,全部的Session共享一個二級緩存,在二級緩存中保存持久化實例併發
的散裝形式的數據
(2)持久化不一樣的數據須要不一樣的Cache 策略,好比一些因素影響Cache策略的選擇:數據的讀寫比例,數據表可否被其餘的應用程序所訪問等。數據庫設計
設置Hibernate 二級緩存須要分兩步,首先,確認使用什麼數據併發策略,而後,配置緩存期間時間並設置Cache提供器 Hibernate的查詢方式常見有三種:HQL,QBC(命名查詢),以及使用原生SQL查詢
Hibernate和JDBC優缺點對比fetch
相同點: 1)二者都是java數據庫操做的中間件 2)二者對數據庫進行直接操做的對象時線程不安全的,都需及時關閉 3)二者均可對數據庫的更新操做進行顯示的事務處理 使用的SQL語言不一樣:JDBC使用是基於關係型數據庫的標準SQL語言。HIbernate使用是HQL語言 操做的對象不一樣:JDBC操做的是數據,將數據經過SQL語句直接發送的數據庫中執行,Hibernate操做的是持久化對象,有第吃了個持久化對象的數據更新到數據庫中 數據狀態不一樣:JDBC操做的數據時瞬時的,變量的值沒法與數據庫中值保持一致,而Hibernate操做的數據時可持久化的,即持久化對象的數據屬性的值是能夠跟數據庫中的值保持一致 關於Hibernate的orm思想你瞭解多少? ORM指的是對象關係型映射,指的就是咱們經過建立實體類對象和數據庫中的表關係進行一一對應,來實現經過操做實體類對象來更改數據庫裏邊的數據信息,這裏邊起到關鍵做用的是經過HIbernate的映射文件+Hibernate的核心配置文件
get和load的區別
1.get是當即加載,load是延時加載
2.get會先查一級緩存,在查二級緩存,而後查數據庫;load會先查一級緩存,若是沒找到,就建立代理對象,等須要的時候去查詢二級緩存和數據庫,(這裏體現load的延遲加載的特性)
3.get若是沒有找到會返回null,load若是沒有找到會拋出異常
4.當咱們使用session.load方法加載一個對象時,此時並不會發出SQL語句,當前獲得得這個對象實際上是一個代理對象。這個代理對象只保存了實體對象的id值,只有當咱們使用這個對象,獲得其它屬性時,這個時候纔會發出SQL語句,從數據庫中去查詢咱們的對對象,至關於load的延遲加載方式。get就直接的多,當咱們使用Session.get()方法來獲得一個對象時,無論咱們使不使用這個對象,此時都會發出SQL語句從數據庫中查詢出來
如何進行Hibernate 的優化
1.數據庫設計調整。
2.HQL優化
3.API的正確使用
4.主配置參數(日誌,查詢緩存,fetch_sieze,batch_size).
5。映射文件優化(ID生成策略,二級緩存,延遲加載,關聯優化)
6.一級緩存的管理
7.針對二級緩存,還有許多特有的策略
8.事務控制策略