日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size

發(fā)布時(shí)間:2024/9/27 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

這點(diǎn)我也疑惑過(guò),最初應(yīng)用hibernate的項(xiàng)目,我也感覺(jué)速度很慢,知道后來(lái)才知道問(wèn)題的所在。?
????? 其實(shí)hibernate的速度性能并不差,比起jdbc來(lái)說(shuō),又是性能能高2倍。?
????? 當(dāng)然了這和應(yīng)用的數(shù)據(jù)庫(kù)有關(guān),在Oracle上,hibernate支持hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size,而MySQL卻不支持,而我原來(lái)的項(xiàng)目絕大多數(shù)都是使用MySQL的,所以覺(jué)得速度慢,其實(shí)在企業(yè)級(jí)應(yīng)用,尤其是金融系統(tǒng)大型應(yīng)用上,使用Oracle比較多,相對(duì)來(lái)說(shuō),hibernate會(huì)提升系統(tǒng)很多性能的。

?

hibernate.jdbc.fetch_size 50 //讀

hibernate.jdbc.batch_size 30 //寫(xiě)

?

hiberante.cfg.xml(Oracle ,sql server 支持,mysql不支持)

?? <property name="hibernate.jdbc.fetch_size">50</property>
<property name="hibernate.jdbc.batch_size">30</property>

這兩個(gè)選項(xiàng)非常非常非常重要!!!將嚴(yán)重影響Hibernate的CRUD性能!

?

C = create, R = read, U = update, D = delete

?

Fetch Size 是設(shè)定JDBC的Statement讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫(kù)中取出的記錄條數(shù)。

?

例如一次查詢1萬(wàn)條記錄,對(duì)于Oracle的JDBC驅(qū)動(dòng)來(lái)說(shuō),是不會(huì)1次性把1萬(wàn)條取出來(lái)的,而只會(huì)取出Fetch Size條數(shù),當(dāng)紀(jì)錄集遍歷完了這些記錄以后,再去數(shù)據(jù)庫(kù)取Fetch Size條數(shù)據(jù)。

?

因此大大節(jié)省了無(wú)謂的內(nèi)存消耗。當(dāng)然Fetch Size設(shè)的越大,讀數(shù)據(jù)庫(kù)的次數(shù)越少,速度越快;Fetch Size越小,讀數(shù)據(jù)庫(kù)的次數(shù)越多,速度越慢。

?

這有點(diǎn)像平時(shí)我們寫(xiě)程序?qū)懹脖P文件一樣,設(shè)立一個(gè)Buffer,每次寫(xiě)入Buffer,等Buffer滿了以后,一次寫(xiě)入硬盤,道理相同。

?

Oracle數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)默認(rèn)的Fetch Size=10,是一個(gè)非常保守的設(shè)定,根據(jù)我的測(cè)試,當(dāng)Fetch Size=50的時(shí)候,性能會(huì)提升1倍之多,當(dāng)Fetch Size=100,性能還能繼續(xù)提升20%,Fetch Size繼續(xù)增大,性能提升的就不顯著了。

?

因此我建議使用Oracle的一定要將Fetch Size設(shè)到50

?

不過(guò)并不是所有的數(shù)據(jù)庫(kù)都支持Fetch Size特性,例如MySQL就不支持

?

MySQL就像我上面說(shuō)的那種最壞的情況,他總是一下就把1萬(wàn)條記錄完全取出來(lái),內(nèi)存消耗會(huì)非常非常驚人!這個(gè)情況就沒(méi)有什么好辦法了 :(

?

Batch Size是設(shè)定對(duì)數(shù)據(jù)庫(kù)進(jìn)行批量刪除,批量更新和批量插入的時(shí)候的批次大小,有點(diǎn)相當(dāng)于設(shè)置Buffer緩沖區(qū)大小的意思。

?

Batch Size越大,批量操作的向數(shù)據(jù)庫(kù)發(fā)送sql的次數(shù)越少,速度就越快。我做的一個(gè)測(cè)試結(jié)果是當(dāng)Batch Size=0的時(shí)候,使用Hibernate對(duì)Oracle數(shù)據(jù)庫(kù)刪除1萬(wàn)條記錄需要25秒,Batch Size = 50的時(shí)候,刪除僅僅需要5秒!!!

//
我們通常不會(huì)直接操作一個(gè)對(duì)象的標(biāo)識(shí)符(identifier), 因此標(biāo)識(shí)符的setter方法應(yīng)該被聲明為私有的(private)。這樣當(dāng)一個(gè)對(duì)象被保存的時(shí)候,只有Hibernate可以為它分配標(biāo)識(shí)符。 你會(huì)發(fā)現(xiàn)Hibernate可以直接訪問(wèn)被聲明為public,private和protected等不同級(jí)別訪問(wèn)控制的方法(accessor method)和字段(field)。 所以選擇哪種方式來(lái)訪問(wèn)屬性是完全取決于你,你可以使你的選擇與你的程序設(shè)計(jì)相吻合。

所有的持久類(persistent classes)都要求有無(wú)參的構(gòu)造器(no-argument constructor); 因?yàn)镠ibernate必須要使用Java反射機(jī)制(Reflection)來(lái)實(shí)例化對(duì)象。構(gòu)造器(constructor)的訪問(wèn)控制可以是私有的(private), 然而當(dāng)生成運(yùn)行時(shí)代理(runtime proxy)的時(shí)候?qū)⒁笫褂弥辽偈莗ackage級(jí)別的訪問(wèn)控制,這樣在沒(méi)有字節(jié)碼編入 (bytecode instrumentation)的情況下,從持久化類里獲取數(shù)據(jù)會(huì)更有效率一些。

?

?

?

?

hibernate.max_fetch_depth設(shè)置外連接抓取樹(shù)的最大深度

取值.?建議設(shè)置為03之間

?

就是每次你在查詢時(shí),會(huì)級(jí)聯(lián)查詢的深度,譬如你對(duì)關(guān)聯(lián)vo設(shè)置了eager的話,如果fetch_depth值太小的話,會(huì)發(fā)多很多條sql

?

總結(jié)

以上是生活随笔為你收集整理的hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。