黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

第一部分 Java基礎
第二部分 Java進階

Java Hibernate面試題

1、簡述一下hibernate的開發流程?

● 第一步:加載hibernate的配置文件,讀取配置文件的參數(jdbc連接參數,數據庫方言,hbm表與對象關系映射文件)

● 第二步:創建SessionFactory會話工廠(內部有連接池)

● 第三步:打開session獲取連接,構造session對象(一次會話維持一個數據連接,也是一級緩存)

● 第四步:開啟事務

● 第五步:進行操作

● 第六步:提交事務

● 第七步:關閉session(會話)將連接釋放

● 第八步:關閉連接池

2、hibernate 中對象的三種狀態?

瞬時態(臨時態、自由態):不存在持久化標識OID,尚未與Hibernate Session關聯對象,被認為處于瞬時態,失去引用將被JVM回收。

持久態:存在持久化標識OID,與當前session有關聯,并且相關聯的session沒有關閉,并且事務未提交。

脫管態(離線態、游離態):存在持久化標識OID,但沒有與當前session關聯,脫管狀態改變hibernate不能檢測到。

3、hibernate的一級緩存機制?

● Hibernate一級緩存(Session的緩存):

Session實現了第一級Cache,屬于事務級數據緩沖。一旦事務結束,緩存隨之失效。一個Session的生命周期對應一個數據庫事務或一個程序事務。

Session-Cache總是被打開并且不能被關閉的。

Session-Cache保證一個Session中兩次請求同一個對象時,取得的對象是同一個Java實例,有時它可以避免不必要的數據沖突。

在對于同一個對象進行循環引用時,不至于產生堆棧溢出。

當數據庫事務結束時,對于同一數據表行,不會產生數據沖突。因為對于數據庫中的一行,最多有一個對象來表示它。

一個事務中可能會有很多個處理單元,在每一個處理單元中做的操作都會立即被其他的數據單元得知。

4、Hibernate二級緩存(SessionFactory的緩存)?

● 二級緩存是SessionFactory范圍內的緩存,所有的Session共享同一個二級緩存。在二級緩存中保存持久化實例的散裝形式的數據。

● 持久化不同的數據需要不同的Cache策略,比如一些因素將影響Cache策略的選擇:數據的讀/寫比例、數據表是否能被其他的應用程序所訪問等。

● 設置Hibernate二級緩存需要分兩步:首先,確認使用什么數據并發策略。然后,配置緩存過期時間并設置Cache提供器。

5、Hibernate的查詢方式有哪些?

Hibernate的查詢方式常見的主要分為三種:HQL,QBC(命名查詢),以及使用原生SQL查詢(SqlQuery)

6、Hibernate和Mybatis的區別?

● 兩者相同點:

Hibernate與MyBatis都可以是通過SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory生成Session,最后由Session來開啟執行事務和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。

Hibernate和MyBatis都支持JDBC和JTA事務處理。

● Mybatis優勢:

MyBatis可以進行更為細致的SQL優化,可以減少查詢字段。

MyBatis容易掌握,而Hibernate門檻較高。

● Hibernate優勢:

Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果映射。

Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象維護要方便。

Hibernate數據庫移植性很好,MyBatis的數據庫移植性不好,不同的數據庫需要寫不同SQL。

Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。

7、Hibernate和JDBC優缺點對比?

● 相同點:

兩者都是java數據庫操作的中間件。

兩者對數據庫進行直接操作的對象都是線程不安全的,都需要及時關閉。

兩者都可對數據庫的更新操作進行顯式的事務處理。

● 不同點:

JDBC是SUN公司提供一套操作數據庫的規范,使用java代碼操作數據庫。Hibernate是一個基于jdbc的主流持久化框架,對JDBC訪問數據庫的代碼做了封裝。

使用的SQL語言不同:JDBC使用的是基于關系型數據庫的標準SQL語言,Hibernate使用的是HQL(Hibernate query language)語言。

操作的對象不同:JDBC操作的是數據,將數據通過SQL語句直接傳送到數據庫中執行,Hibernate操作的是持久化對象,由底層持久化對象的數據更新到數據庫中。

數據狀態不同:JDBC操作的數據是“瞬時”的,變量的值無法與數據庫中的值保持一致,而Hibernate操作的數據是可持久的,即持久化對象的數據屬性的值是可以跟數據庫中的值保持一致的。

8、關于Hibernate的orm思想你了解多少?

ORM指的是對象關系型映射(Object RelationShip Mapping),指的就是我們通過創建實體類對象和數據庫中的表關系進行一一對應,來實現通過操作實體類對象來更改數據庫里邊的數據信息。這里邊起到關鍵作用的是通過Hibernate的映射文件+Hibernate的核心配置文件。

9、get和load的區別?

● get是立即加載,load是延時加載。

● get會先查一級緩存,再查二級緩存,然后查數據庫;load會先查一級緩存,如果沒有找到就創建代理對象,等需要的時候去查詢二級緩存和數據庫。(這里就體現load的延遲加載的特性。)

● get如果沒有找到會返回null,load如果沒有找到會拋出異常。

● 當我們使用session.load()方法來加載一個對象時,此時并不會發出sql語句,當前得到的這個對象其實是一個代理對象,這個代理對象只保存了實體對象的id值,只有當我們要使用這個對象,得到其它屬性時,這個時候才會發出sql語句,從數據庫中去查詢我們的對象;相對于load的延遲加載方式,get就直接的多,當我們使用session.get()方法來得到一個對象時,不管我們使不使用這個對象,此時都會發出sql語句去從數據庫中查詢出來。

10、如何進行Hibernate的優化?

● 數據庫設計調整。

● HQL優化。

● API的正確使用(如根據不同的業務類型選用不同的集合及查詢API)。

● 主配置參數(日志,查詢緩存,fetch_size,batch_size等)。

● 映射文件優化(ID生成策略,二級緩存,延遲加載,關聯優化)。

● 一級緩存的管理。

● 針對二級緩存,還有許多特有的策略。

● 事務控制策略。

11、什么是Hibernate延遲加載?

延遲加載機制是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正需要數據的時候,才真正執行數據加載操作。在Hibernate中提供了對實體對象的延遲加載以及對集合的延遲加載,另外在Hibernate3中還提供了對屬性的延遲加載。

延遲加載的過程:通過代理(Proxy)機制來實現延遲加載。Hibernate從數據庫獲取某一個對象數據時、獲取某一個對象的集合屬性值時,或獲取某一個對象所關聯的另一個對象時,由于沒有使用該對象的數據(除標識符外),Hibernate并不從數據庫加載真正的數據,而只是為該對象創建一個代理對象來代表這個對象,這個對象上的所有屬性都為默認值;只有在真正需要使用該對象的數據時才創建這個真正的對象,真正從數據庫中加載它的數據。

12、No Session問題原理及解決方法?

No session問題報錯如下:

根據字面上的意思,是指代理不能被初始化,session已經關閉。

● No session問題產生的原因:

當執行Session的load()方法時,Hibernate不會立即執行查詢所查詢對象關聯的對象(在此我們統稱被關聯的對象類為A類),僅僅返回A類的代理類的實例,這個代理類具由以下特征:

由Hibernate在運行時動態生成,它擴展了A類,因此它繼承了A類的所有屬性和方法,但它的實現對于應用程序是透明的。

當Hibernate創建A類代理類實例時,僅僅初始化了它的OID屬性,其他屬性都為null,因此這個代理類實例占用的內存很少。

當應用程序第一次訪問A代理類實例時(例如調用a..getXXX()或a.setXXX()方法),Hibernate會初始化代理類實例,在初始化過程中執行select語句,真正從數據庫中加載A對象的所有數據。但有個例外,那就是當應用程序訪問A代理類實例的getId()方法時,Hibernate不會初始化代理類實例,因為在創建代理類實例時OID就存在了,不必到數據庫中去查詢。

Hibernate采用CGLIB工具來生成持久化類的代理類。CGLIB是一個功能強大的Java字節碼生成工具,它能夠在程序運行時動態生成擴展Java類或者實現Java接口的代理類。

Hibernate中如果采用load加載的話(默認的是延遲加載),也就是lazy=true操作,因此,當調用完load后,session即可關閉。又因為我們的session只是放置到了Dao層,表現層根本獲取不到,所以在表現層調用的時候,session已經關閉,報錯。

13、Spring的兩種代理JDK和CGLIB的區別淺談?

Java動態代理是利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。而cglib動態代理是利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理。

● 如果目標對象實現了接口,默認情況下會采用JDK的動態代理實現AOP,或者強制使用CGLIB實現AOP。

● 如果目標對象沒有實現了接口,必須采用CGLIB庫,Spring會自動在JDK動態代理和CGLIB之間轉換。

14、敘述Session的緩存的作用?

● 減少訪問數據庫的頻率。應用程序從內存中讀取持久化對象的速度顯然比到數據庫中查詢數據的速度快多了,因此Session的緩存可以提高數據訪問的性能。

● 保證緩存中的對象與數據庫中的相關記錄保持同步。當緩存中持久化對象的狀態發生了變換,Session并不會立即執行相關的SQL語句,這使得Session能夠把幾條相關的SQL語句合并為一條SQL語句,以便減少訪問數據庫的次數,從而提高應用程序的性能。

15、Session的清理和清空有什么區別?

Session清理緩存是指按照緩存中對象的狀態的變化來同步更新數據庫;清空是Session的關閉;

16、請簡述Session的特點有哪些?

● 不是線程安全的,因此在設計軟件架構時,應該避免多個線程共享同一個Session實例。

● Session實例是輕量級的,所謂輕量級是指它的創建和銷毀不需要消耗太多的資源。這意味著在程序中可以經常創建或銷毀Session對象,例如為每個客戶請求分配單獨的Session實例,或者為每個工作單元分配單獨的Session實例。

● 在Session中,每個數據庫操作都是在一個事務(transaction)中進行的,這樣就可以隔離開不同的操作(甚至包括只讀操作)。

17、比較Hibernate三種檢索策略的優缺點?

● 立即檢索

● 優點:對應用程序完全透明,不管對象處于持久化狀態,還是游離狀態,應用程序都可以方便的從一個對象導航到與它關聯的對象;

● 缺點:1.select語句太多;2.可能會加載應用程序不需要訪問的對象白白浪費許多內存空間;

● 延遲檢索

● 優點:由應用程序決定需要加載哪些對象,可以避免可執行多余的select語句,以及避免加載應用程序不需要訪問的對象。因此能提高檢索性能,并且能節省內存空間;

● 缺點:應用程序如果希望訪問游離狀態代理類實例,必須保證他在持久化狀態時已經被初始化;

● 迫切左外連接檢索

●優點:

1、對應用程序完全透明,不管對象處于持久化狀態,還是游離狀態,應用程序都可以方便地沖一個對象導航到與它關聯的對象。

2、使用了外連接,select語句數目少;

● 缺點:

1、可能會加載應用程序不需要訪問的對象,白白浪費許多內存空間;

2、復雜的數據庫表連接也會影響檢索性能;???????

全部教程
主站蜘蛛池模板: 国产成在线观看免费视频 | 午夜影院免费在线观看 | 99爱在线精品视频网站 | 日本在线亚州精品视频在线 | 欧美日本视频在线观看 | 一个人看www免费视频 | 免费黄色毛片视频 | 婷婷成人综合 | 国产在线91精品天天更新 | 国产精品亚洲一区二区在线观看 | 亚洲国产成人久久综合区 | 在线播放黄色网址 | 男女情趣视频免费播放 | 在线中文字日产区乱码 | 在线播放一区二区精品产 | 日日噜噜夜夜狠狠扒开双腿 | 亚洲第一黄网站 | 国产成人在线观看免费网站 | 国产福利在线观看 | 高清毛片aaaaaaaaa片 | 青草青草视频2免费观看 | 狠狠操视频网站 | 国内在线观看精品免费视频 | 五月婷婷中文字幕 | 性另类交性类交 | 一本大道香蕉在线影院 | 亚洲欧美视频一区二区三区 | 人人干人人干人人干 | 最新中文字幕在线播放 | 欧美亚洲日本在线 | www.羞羞| 天堂最新资源在线 | 日韩深夜 | 精品国产欧美一区二区最新 | 欧美一区二区视频三区 | 欧美激情人成日本在线视频 | 亚洲综合成人在线 | 欧洲三级在线观看 | 无遮挡黄动漫在线观看播放 | 亚洲社区在线观看 | 99久久亚洲 |