<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    深藍(lán)色心情

    過(guò)來(lái)聊聊~~~~

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      31 Posts :: 0 Stories :: 46 Comments :: 0 Trackbacks


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

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

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

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

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


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

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

    1hibernate.dialect net.sf.hibernate.dialect.MySQLDialect 
    2hibernate.connection.driver_class com.mysql.jdbc.Driver 
    3hibernate.connection.url jdbc:mysql:///test 
    4hibernate.connection.username root 
    5hibernate.connection.password  
    6


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


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

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

    只是提醒一點(diǎn),Hibernate這個(gè)連接池是非常原始非常簡(jiǎn)單的連接池,如果你在項(xiàng)目中用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ù)就不必寫了,因?yàn)橐呀?jīng)在App Server配置連接池的時(shí)候指定好了。

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

    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

    雜項(xiàng)配置:


    hibernate.show_sql false

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


    #hibernate.connection.isolation 4

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

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


    這兩個(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í)我們寫程序?qū)懹脖P文件一樣,設(shè)立一個(gè)Buffer,每次寫入Buffer,等Buffer滿了以后,一次寫入硬盤,道理相同。

    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%,F(xiàn)etch 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秒!!!

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

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


    #hibernate.jdbc.use_scrollable_resultset true

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

    #hibernate.cglib.use_reflection_optimizer false 


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

    不過(guò),當(dāng)你在調(diào)試程序過(guò)程中,特別是和proxy,lazy loading相關(guān)的應(yīng)用中,代碼出錯(cuò),但是出錯(cuò)提示信息有語(yǔ)焉不詳,那么你可以把cglib優(yōu)化關(guān)掉,這樣Hibernate會(huì)輸出比較詳細(xì)的調(diào)試信息,幫助你debug。
    posted on 2005-12-02 11:48 深藍(lán)色心情 閱讀(494) 評(píng)論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 亚洲一本之道高清乱码| 黄色a级免费网站| jzzijzzij在线观看亚洲熟妇| 久久免费视频99| 四虎永久免费影院| 亚洲福利视频一区二区三区| 免费国产黄网站在线观看动图| 久久精品免费一区二区| 久久精品国产精品亚洲精品| 一级特黄a免费大片| 国产一区二区三区免费视频| 男女作爱在线播放免费网站| 亚洲色大情网站www| 成年18网站免费视频网站| 亚洲国产精品乱码在线观看97| 每天更新的免费av片在线观看| 亚洲精品你懂的在线观看| 一级成人毛片免费观看| 亚洲欧洲日产韩国在线| 2048亚洲精品国产| 国产高潮流白浆喷水免费A片 | 中文字幕亚洲无线码a| 一级毛片aa高清免费观看| 亚洲AV成人无码天堂| 精品亚洲一区二区| 免费国内精品久久久久影院| 免费人成视频在线播放| 亚洲婷婷天堂在线综合| 亚洲精品午夜国产VA久久成人| 免费黄色毛片视频| 美女被暴羞羞免费视频| 亚洲另类自拍丝袜第1页| 在线免费观看色片| 二级毛片免费观看全程| 亚洲AV日韩精品久久久久久| 久久福利青草精品资源站免费| 亚洲色偷偷av男人的天堂| 性做久久久久久久免费看| 亚洲中文字幕久久久一区| 久久久久亚洲av无码专区导航| 无码少妇一区二区浪潮免费|