對Hibernate使用之愚見
? 國人跟風之潮,自古有之,至今亦然。
?? 確實,經過配置優化的Hibernate效率與無任何優化的Hibernate效率誠然不可同日而語。但由于項目開發的復雜性,開發周期中一些突發因素的制約,及項目構建者自身能力的約束,在大型項目中,尤其是在表結構復雜的大型項目中,以某之愚見,國內能將Hibernate真正使用妥當者,尚未多有。
目前隨處可見的Hibernate優化方式無外以下幾條
?? 1、修改hibernate.properties,增加以下兩句:
????????? hibernate.jdbc.fetch_size=50 設定JDBC的Statement讀取數據的時候每次從數據庫中取出的記錄條數,目前MySQL似乎還不支持
????????? hibernate.jdbc.batch_size=100 對數據庫進行批量刪除,批量更新和批量插入的時候的批次大小,令多條語句使用batch操作
?? 2、one-to-many的關系里將lazy設成true,開啟延遲加載
?? 3、HQL優化,對于語句本身進行優化
?? 4、映射文件優化(ID生成策略,二級緩存,延遲加載,關聯優化)
?? 5、對大數據量查詢時,慎用list()或者iterator()返回查詢結果
?? 6、Session管理優化,可考慮使用spring的HibernateTemplate
?? 7、一級緩存的管理優化
?? 8、針對二級緩存,使用相關策略
?? 9、事務控制優化
?
? 另外Hibernate本身借助cglib對字節碼有一定程度的優化,但是目前受到Java本身效率限制,感覺上幫助并非很大。
? 當然了,我僅是大體上說說,本身還有很多很多細節方面的問題存在,及其它很多設置可供調整。但是,由于本人之不學,即使這樣,設定出的Hibernate之效率依舊不高,PS:我開篇便已說過,這是由于本人能力低下造成的,與Hibernate無甚相關。
? 但在同樣表結構復雜項目中,使用相對簡單的ibatis,不需什么配置,卻明顯在效率上優于Hibernate(再重申,在下從沒說過Hibernate效率有問題,只是某才疏學淺配置不當而已),
? 我粗略的將兩者作以下對比:
1.? iBATIS非常簡單易學,Hibernate相對較復雜,門檻較高(借助IDE還比較方便)。
2.? 二者都是比較優秀的開源產品(誰否認?誰敢否認?)
3.? 當系統屬于二次開發,無法對數據庫結構做到控制和修改,那iBATIS的靈活性將比Hibernate更適合(我就是經常做遺留項目……)
4.? 系統數據處理量巨大,性能要求極為苛刻,這往往意味著我們必須通過經過高度優化的SQL語句(或存儲過程)才能達到系統性能設計指標。在這種情況下iBATIS會有更好的可控性和表現。
5.? iBATIS需要手寫sql語句,也可以生成一部分,Hibernate則基本上可以自動生成,偶爾會寫一些Hql。同樣的需求,iBATIS的工作量比
Hibernate要大很多。類似的,如果涉及到數據庫字段的修改,Hibernate修改的地方很少,而iBATIS要把那些sql mapping的地方一一修改。(真正配置好的Hibernate當然很方便,問題是什么人負責配置……)
6.? iBATIS以數據庫字段一一對應映射得到的PO和Hibernte這種對象化映射得到的PO是截然不同的,本質區別在于這種PO是扁平化的,不像Hibernate映射的PO是可以表達立體的對象繼承,聚合等等關系的,這將會直接影響到你的整個軟件系統的設計思路。
7.? Hibernate現在已經是主流O/R Mapping框架,從文檔的豐富性,產品的完善性,版本的開發速度都要強于iBATIS(從目前大多數公司的跟風態度便可以看出)
8.? 最關鍵的一句話是iBATIS的作者說的,我認為很誠懇:
If you are starting a new project and you're in full control of your object model and database design, Hibernate is a good choice of O/R tool.
If you are accessing any 3rd party databases (e.g. vendor supplied), or you're working with a legacy database, or even just a really poorly designed database, then an O/R mapper might not be capable of handling the situation. That's were an SQL Mapper comes in handy
?事實上,我并不反對Hibernate,而且是在爭取成為其擁護者(最近在開始扣Hibernate代碼,其實從05年就開始,但是沒堅持超過3天……),
但是,以某之不才及短見,卻不贊同無論任何項目都使用Hibernate,尤其是無理由的想當然跟風使用。甚至某些人把背下Hibernate中一些API都當成很自豪的事情,更讓我覺得不可理喻。
?
?框架體系這些東西,說到底,是為更有效的完成編程目的而存在的。無論內部斗得多么厲害,對用戶來說也是毫不相關的事情(除非用戶在某些事物影響下自己提出來要用什么框架……), 愚雖不才,還是希望能因時因人因事而定,不要一概而論。
有感而發,不知所云,興起而言,興盡乃至。
?
posted on 2007-08-19 19:56 cping 閱讀(...) 評論(...) 編輯 收藏