hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
?
這點我也疑惑過,最初應用hibernate的項目,我也感覺速度很慢,知道后來才知道問題的所在。?
????? 其實hibernate的速度性能并不差,比起jdbc來說,又是性能能高2倍。?
????? 當然了這和應用的數(shù)據(jù)庫有關,在Oracle上,hibernate支持hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size,而MySQL卻不支持,而我原來的項目絕大多數(shù)都是使用MySQL的,所以覺得速度慢,其實在企業(yè)級應用,尤其是金融系統(tǒng)大型應用上,使用Oracle比較多,相對來說,hibernate會提升系統(tǒng)很多性能的。
?
hibernate.jdbc.fetch_size 50 //讀
hibernate.jdbc.batch_size 30 //寫
?
hiberante.cfg.xml(Oracle ,sql server 支持,mysql不支持)
?? <property name="hibernate.jdbc.fetch_size">50</property>
<property name="hibernate.jdbc.batch_size">30</property>
這兩個選項非常非常非常重要!!!將嚴重影響Hibernate的CRUD性能!
?
C = create, R = read, U = update, D = delete
?
Fetch Size 是設定JDBC的Statement讀取數(shù)據(jù)的時候每次從數(shù)據(jù)庫中取出的記錄條數(shù)。
?
例如一次查詢1萬條記錄,對于Oracle的JDBC驅(qū)動來說,是不會1次性把1萬條取出來的,而只會取出Fetch Size條數(shù),當紀錄集遍歷完了這些記錄以后,再去數(shù)據(jù)庫取Fetch Size條數(shù)據(jù)。
?
因此大大節(jié)省了無謂的內(nèi)存消耗。當然Fetch Size設的越大,讀數(shù)據(jù)庫的次數(shù)越少,速度越快;Fetch Size越小,讀數(shù)據(jù)庫的次數(shù)越多,速度越慢。
?
這有點像平時我們寫程序?qū)懹脖P文件一樣,設立一個Buffer,每次寫入Buffer,等Buffer滿了以后,一次寫入硬盤,道理相同。
?
Oracle數(shù)據(jù)庫的JDBC驅(qū)動默認的Fetch Size=10,是一個非常保守的設定,根據(jù)我的測試,當Fetch Size=50的時候,性能會提升1倍之多,當Fetch Size=100,性能還能繼續(xù)提升20%,Fetch Size繼續(xù)增大,性能提升的就不顯著了。
?
因此我建議使用Oracle的一定要將Fetch Size設到50。
?
不過并不是所有的數(shù)據(jù)庫都支持Fetch Size特性,例如MySQL就不支持。
?
MySQL就像我上面說的那種最壞的情況,他總是一下就把1萬條記錄完全取出來,內(nèi)存消耗會非常非常驚人!這個情況就沒有什么好辦法了 :(
?
Batch Size是設定對數(shù)據(jù)庫進行批量刪除,批量更新和批量插入的時候的批次大小,有點相當于設置Buffer緩沖區(qū)大小的意思。
?
Batch Size越大,批量操作的向數(shù)據(jù)庫發(fā)送sql的次數(shù)越少,速度就越快。我做的一個測試結果是當Batch Size=0的時候,使用Hibernate對Oracle數(shù)據(jù)庫刪除1萬條記錄需要25秒,Batch Size = 50的時候,刪除僅僅需要5秒!!!
//
我們通常不會直接操作一個對象的標識符(identifier), 因此標識符的setter方法應該被聲明為私有的(private)。這樣當一個對象被保存的時候,只有Hibernate可以為它分配標識符。 你會發(fā)現(xiàn)Hibernate可以直接訪問被聲明為public,private和protected等不同級別訪問控制的方法(accessor method)和字段(field)。 所以選擇哪種方式來訪問屬性是完全取決于你,你可以使你的選擇與你的程序設計相吻合。
所有的持久類(persistent classes)都要求有無參的構造器(no-argument constructor); 因為Hibernate必須要使用Java反射機制(Reflection)來實例化對象。構造器(constructor)的訪問控制可以是私有的(private), 然而當生成運行時代理(runtime proxy)的時候?qū)⒁笫褂弥辽偈莗ackage級別的訪問控制,這樣在沒有字節(jié)碼編入 (bytecode instrumentation)的情況下,從持久化類里獲取數(shù)據(jù)會更有效率一些。
?
?
而
?
?
| hibernate.max_fetch_depth | 設置外連接抓取樹的最大深度 取值.?建議設置為0到3之間 |
?
就是每次你在查詢時,會級聯(lián)查詢的深度,譬如你對關聯(lián)vo設置了eager的話,如果fetch_depth值太小的話,會發(fā)多很多條sql
?
總結
以上是生活随笔為你收集整理的hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: h6双离合变速箱怎么样 对比不同品牌的双
- 下一篇: c3p0的配置解释