WEB2.0開發(fā)

          心態(tài)決定行為,行為決定習(xí)慣,習(xí)慣決定命運(yùn)

          Hibernate入門 - 基礎(chǔ)配置

          Hibernate入門 - 基礎(chǔ)配置
          thinking_org 原創(chuàng) 更新:2006-07-07 20:39:43 版本: 1.0

          Hibernate配置文件可以有兩種格式,一種是 hibernate.properties ,另一種是 hibernate.cfg.xml

          后者稍微方便一些,當(dāng)增加hbm映射文件的時候,可以直接在 hibernate.cfg.xml 里面增加,不必像 hibernate.properties 必須在初始化代碼中加入。

          但不管怎么說,兩種的配置項都是一樣的,下面詳細(xì)介紹:

          在Hibernate的src目錄下有一個 hibernate.properties 模板,我們不必自己從頭寫,修改模板就可以了:)


          hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'

          這個配置意思是當(dāng)你在Hibernate里面輸入true的時候,Hibernate會轉(zhuǎn)化為1插入數(shù)據(jù)庫,當(dāng)你在Hibernate里面輸入false的時候,Hibernate會轉(zhuǎn)化為0插入數(shù)據(jù)庫,后面的Y,N同理。

          對于某些數(shù)據(jù)庫,例如Oracle來說,沒有boolean數(shù)據(jù)類型,就是采用1代表true,0代表false,因此使用這個配置在Hibernate里面直接用true/false會非常直觀。


          hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
          hibernate.connection.driver_class com.mysql.jdbc.Driver
          hibernate.connection.url jdbc:mysql:///test
          hibernate.connection.username root
          hibernate.connection.password

          這是一個連接MySQL數(shù)據(jù)庫的例子,很直觀,不必解釋,不同的數(shù)據(jù)庫的連接參數(shù)模板中全部給出了。


          hibernate.connection.pool_size 1
          hibernate.statement_cache.size 25

          這是Hibernate自帶的連接池的配置參數(shù),在默認(rèn)情況下將采用。意義很直觀,不多解釋。

          只是提醒一點(diǎn),Hibernate這個連接池是非常原始非常簡單的連接池,如果你在項目中用Hibernate的話,建議你首選App Server的連接池,次選Hibernate帶的DBCP連接池。自帶的連接池應(yīng)該做為末選。

          如果你采用DBCP連接池,除了要配置DBCP連接池以外,還需要取消掉下行的注釋:

          hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider

          其它的連接池同理。

          如果采用App Server的連接池,假設(shè)App Server連接池的DataSource的JNDI名稱為"mypool"的話,配置應(yīng)該如下:

          hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
          hibernate.connection.datasource mypool
          hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider

          其它參數(shù)就不必寫了,因為已經(jīng)在App Server配置連接池的時候指定好了。

          如果你不是在App Server環(huán)境中使用Hibernate,例如遠(yuǎn)程客戶端程序,但是你又想用App Server的數(shù)據(jù)庫連接池,那么你還需要配置JNDI的參數(shù),例如Hibernate連接遠(yuǎn)程Weblogic上的數(shù)據(jù)庫連接池:

          hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
          hibernate.connection.datasource mypool
          hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider
          hibernate.jndi.class weblogic.jndi.WLInitialContextFactory
          hibernate.jndi.url t3://servername:7001/


          最后,如果你需要在EJB或者JTA中使用Hibernate,需要取消下行的注釋:

          hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory

          雜項配置:


          hibernate.show_sql false

          是否將Hibernate發(fā)送給數(shù)據(jù)庫的sql顯示出來,這是一個非常非常有用處的功能。當(dāng)你在調(diào)試Hibernate的時候,讓Hibernate打印sql語句,可以幫助你迅速解決問題。


          #hibernate.connection.isolation 4

          指定數(shù)據(jù)庫的隔離級別,往往不同的數(shù)據(jù)庫有自己定義的隔離級別,未必是Hibernate的設(shè)置所能更改的,所以也不必去管它了。


          hibernate.jdbc.fetch_size 50
          hibernate.jdbc.batch_size 25

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

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

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

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

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

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

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

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

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

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

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

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

          可見有多么大的性能提升!很多人做Hibernate和JDBC的插入性能測試會奇怪的發(fā)現(xiàn)Hibernate速度至少是JDBC的兩倍,就是因為Hibernate使用了Batch Insert,而他們寫的JDBC沒有使用Batch的緣故。

          以我的經(jīng)驗來看,Oracle數(shù)據(jù)庫 Batch Size = 30 的時候比較合適,50也不錯,性能會繼續(xù)提升,50以上,性能提升的非常微弱,反而消耗內(nèi)存更加多,就沒有必要了。


          #hibernate.jdbc.use_scrollable_resultset true

          設(shè)定是否可以使用JDBC2.0規(guī)范的可滾動結(jié)果集,這對Hibernate的分頁顯示有一定的作用,默認(rèn)就好了。


          #hibernate.cglib.use_reflection_optimizer false

          默認(rèn)打開,啟用cglib反射優(yōu)化。cglib是用來在Hibernate中動態(tài)生成PO字節(jié)碼的,打開優(yōu)化可以加快字節(jié)碼構(gòu)造的速度。

          不過,當(dāng)你在調(diào)試程序過程中,特別是和proxy,lazy loading相關(guān)的應(yīng)用中,代碼出錯,但是出錯提示信息有語焉不詳,那么你可以把cglib優(yōu)化關(guān)掉,這樣Hibernate會輸出比較詳細(xì)的調(diào)試信息,幫助你debug

          posted on 2007-05-08 19:30 ymx 閱讀(462) 評論(1)  編輯  收藏 所屬分類: Hibernate

          評論

          # re: Hibernate入門 - 基礎(chǔ)配置 2007-09-30 09:15 yinf

          不錯
          謝謝!!
          轉(zhuǎn)走了哈!!  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 灵宝市| 乌苏市| 深圳市| 墨脱县| 秦安县| 保山市| 民县| 黄浦区| 岳池县| 正蓝旗| 西林县| 南郑县| 寿光市| 梁河县| 高雄县| 长岭县| 文昌市| 双流县| 信宜市| 喜德县| 定安县| 渝中区| 铜川市| 白玉县| 醴陵市| 宿州市| 汪清县| 略阳县| 荣昌县| 义马市| 沽源县| 邵阳县| 绥宁县| 田阳县| 汤阴县| 铁岭县| 晴隆县| 灵璧县| 合山市| 五原县| 玉溪市|