Java面試題之Hibernate
1.簡(jiǎn)書一下Hibernated的開發(fā)流程
第一步:加載Hibernate的配置文件,讀取配置文件的參數(shù),
第二步:創(chuàng)建SessionFactory會(huì)話工廠(內(nèi)部有連接池)
第三步:打開Session 連接
第四步:開啟事務(wù)
第五步:運(yùn)行操作
第六步:提交事務(wù)
第七步:關(guān)閉session
第八步:關(guān)閉連接池
2.Hibernate 中對(duì)對(duì)象的三種狀態(tài)
瞬時(shí)狀態(tài):不存在持久化標(biāo)識(shí)的OID,尚未與HibernateSession對(duì)象關(guān)聯(lián),被認(rèn)為處于瞬時(shí)狀態(tài),失去引用將被JVM回收
持久態(tài):存在持久標(biāo)識(shí)OID,與當(dāng)前session有關(guān)聯(lián),并且相關(guān)聯(lián)Session沒有關(guān)閉,并且事務(wù)未提交
游離態(tài):存在持久化標(biāo)識(shí)OID,但沒有與當(dāng)前Session關(guān)聯(lián),
3.Hibernate的緩存機(jī)制
Hibernate緩存機(jī)制分為兩層,Hibernate的一級(jí)緩存和Hibernate二級(jí)緩存。
1.Hibernate一級(jí)緩存(Session的緩存)
Session 實(shí)現(xiàn)了第一級(jí)Cache,屬于事務(wù)級(jí)數(shù)據(jù)緩沖,一旦事務(wù)結(jié)束,緩存隨之失效,一個(gè)Session的生命周期對(duì)應(yīng)一個(gè)數(shù)據(jù)庫事務(wù)或一個(gè)程序事務(wù)。
Session-Cache總是被打開并且不能被關(guān)閉的
Session-Cache 保證一個(gè)Session中兩次請(qǐng)求同一個(gè)對(duì)象時(shí),取得的對(duì)象是一個(gè)Java實(shí)例,有時(shí)他可以避免數(shù)據(jù)不必要的沖突
Hibernate 二級(jí)緩存(SessionFactory的緩存)
(1)Hibernate 二級(jí)緩沖是SessionFactory范圍內(nèi)的緩存,所有的Session共享一個(gè)二級(jí)緩存,在二級(jí)緩存中保存持久化實(shí)例
的散裝形式的數(shù)據(jù)
(2)持久化不同的數(shù)據(jù)需要不同的Cache 策略,比如一些因素影響Cache策略的選擇:數(shù)據(jù)的讀寫比例,數(shù)據(jù)表能否被其他的應(yīng)用程序所訪問等。
設(shè)置Hibernate 二級(jí)緩存需要分兩步,首先,確認(rèn)使用什么數(shù)據(jù)并發(fā)策略,然后,配置緩存期間時(shí)間并設(shè)置Cache提供器
Hibernate的查詢方式常見有三種:HQL,QBC(命名查詢),以及使用原生SQL查詢
Hibernate和JDBC優(yōu)缺點(diǎn)對(duì)比
相同點(diǎn):
1)兩者都是java數(shù)據(jù)庫操作的中間件
2)兩者對(duì)數(shù)據(jù)庫進(jìn)行直接操作的對(duì)象時(shí)線程不安全的,都需及時(shí)關(guān)閉
3)兩者都可對(duì)數(shù)據(jù)庫的更新操作進(jìn)行顯示的事務(wù)處理
使用的SQL語言不同:JDBC使用是基于關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)SQL語言。HIbernate使用是HQL語言
操作的對(duì)象不同:JDBC操作的是數(shù)據(jù),將數(shù)據(jù)通過SQL語句直接發(fā)送的數(shù)據(jù)庫中執(zhí)行,Hibernate操作的是持久化對(duì)象,有第吃了個(gè)持久化對(duì)象的數(shù)據(jù)更新到數(shù)據(jù)庫中
數(shù)據(jù)狀態(tài)不同:JDBC操作的數(shù)據(jù)時(shí)瞬時(shí)的,變量的值無法與數(shù)據(jù)庫中值保持一致,而Hibernate操作的數(shù)據(jù)時(shí)可持久化的,即持久化對(duì)象的數(shù)據(jù)屬性的值是可以跟數(shù)據(jù)庫中的值保持一致
關(guān)于Hibernate的orm思想你了解多少?
ORM指的是對(duì)象關(guān)系型映射,指的就是我們通過創(chuàng)建實(shí)體類對(duì)象和數(shù)據(jù)庫中的表關(guān)系進(jìn)行一一對(duì)應(yīng),來實(shí)現(xiàn)通過操作實(shí)體類對(duì)象來更改數(shù)據(jù)庫里邊的數(shù)據(jù)信息,這里邊起到關(guān)鍵作用的是通過HIbernate的映射文件+Hibernate的核心配置文件
get和load的區(qū)別
1.get是立即加載,load是延時(shí)加載
2.get會(huì)先查一級(jí)緩存,在查二級(jí)緩存,然后查數(shù)據(jù)庫;load會(huì)先查一級(jí)緩存,如果沒找到,就創(chuàng)建代理對(duì)象,等需要的時(shí)候去查詢二級(jí)緩存和數(shù)據(jù)庫,(這里體現(xiàn)load的延遲加載的特性)
3.get如果沒有找到會(huì)返回null,load如果沒有找到會(huì)拋出異常
4.當(dāng)我們使用session.load方法加載一個(gè)對(duì)象時(shí),此時(shí)并不會(huì)發(fā)出SQL語句,當(dāng)前得到得這個(gè)對(duì)象其實(shí)是一個(gè)代理對(duì)象。這個(gè)代理對(duì)象只保存了實(shí)體對(duì)象的id值,只有當(dāng)我們使用這個(gè)對(duì)象,得到其它屬性時(shí),這個(gè)時(shí)候才會(huì)發(fā)出SQL語句,從數(shù)據(jù)庫中去查詢我們的對(duì)對(duì)象,相當(dāng)于load的延遲加載方式。get就直接的多,當(dāng)我們使用Session.get()方法來得到一個(gè)對(duì)象時(shí),不管我們使不使用這個(gè)對(duì)象,此時(shí)都會(huì)發(fā)出SQL語句從數(shù)據(jù)庫中查詢出來
如何進(jìn)行Hibernate 的優(yōu)化
1.數(shù)據(jù)庫設(shè)計(jì)調(diào)整。
2.HQL優(yōu)化
3.API的正確使用
4.主配置參數(shù)(日志,查詢緩存,fetch_sieze,batch_size).
5。映射文件優(yōu)化(ID生成策略,二級(jí)緩存,延遲加載,關(guān)聯(lián)優(yōu)化)
6.一級(jí)緩存的管理
7.針對(duì)二級(jí)緩存,還有許多特有的策略
8.事務(wù)控制策略
聯(lián)系客服