JavaEye活動記實 Gavin King見面會以及Robbin Hibernate性能調優

4月19日,如期趕到交大參加GavinKing的見面會,上次參加JavaEye的活動還只是在視頻上看到Gavin,當時他語速很快,而且有些含混的地方,不知道這次面對面會是個啥樣子。
JavaEye還是真厲害,給我們提供這樣的機會與Hibernate之父見面,羨煞旁人哦,呵呵。

活動分4個部分:Gavin的演講、Robbin的Hibernate性能調優、曹曉鋼有關JBoss Seam的介紹、Gavin King答疑

一、Gavin演講

      本來我是用手機錄的視頻並想拿回來給大家分享的,但是沒想到手機突然沒電,而錄的30分鐘視頻完全丟失,真是無比鬱悶的!
     Gavin說話比較快,而且偶爾也會說的很模糊,對於聽力不怎麼靈光的我來說實在是有難度。所以僅僅是聽懂了大體的意思。
     Gavin打開Hibernate官方網站www.hibernate.org然後逐一演示幾個關鍵的開源軟件:hibernate core,hibernate annotations,hibernate entity manager等等。感覺介紹都是比較大略的(主要是我能聽懂的也不多),介紹hibernate的時候講到Hibernate和JPA的使用,但是 JPA我沒使用過,他說今後使用Hibernate的時候可以更多的使用JPA而不用使用Hibernate;講到Hibernate Annotations的時候問大家配置Hiberante是使用schema還是annotations,看到使用Annotations用的少的時 候,說建議大家嘗試使用,但是這個目前爲止並沒有被大家所認可,所以是否使用還有待觀察哦;接下來講的entitymanager、shard、 validator、search、tools我都沒有使用過,聽了他的介紹以後也只是簡單瞭解一下,是否使用就要看以後有沒有相應的需求了。有趣的是 Gavin還提到了Spring,說大家使用Spring+hibernate的時候都會遇到延遲加載的問題吧,但是大家都沒怎麼聽懂,後來robbin 在下面現場翻譯了一下,纔多了幾個人舉手,Gavin說應該會有很多人碰到的,而EJB3不會碰到,呵呵。

     其實Gavin此次來中國主要是爲Radhat推廣JBoss Seam,在北京說他講了一天時間,因爲那次是商業活動,而到了上海是JavaEye的社區活動,加上他剛剛出了一次小車禍,所以在上海只講了一個小時,其中有20分鐘是介紹JBossSeam的,同樣令我摸不到頭腦。介紹JBoss Seam,Gavin很有信心,而且好像很努力的在討好SUN,希望能加入JEE標準中,因爲他相信在EJB2時代不被看好的Hibernate已經上 位,而Seam也可能走這條路。接下來進行了介紹,還講解官方網站上的Demo,但是由於網絡延遲太嚴重,他還在演講臺上做了一個原地的跳動來模仿鼠標等 待的樣子,相當的搞笑。接下來的回答問題環節,一位同學提到了ROR,說Hibernate是如何來應對Convention over configuration的挑戰呢?結果引起Gavin的劇烈反應,Gavin顯示出對ROR的不削,而且還說EJB在幾年以前就有COC的理念了, ROR還嫩的很,隨即還即興寫了一小段代碼來掩飾EJB3中如何使用annotations來實現COC,他的迴應贏得滿場的掌聲。整個演講持續一個多小 時,而我還損失了30分鐘的真人視頻 :(。Robbin說Gavin受了兩年的成名的考驗以後,顯然比原來更適應大場面,演講聲音很大,吐字也清晰了許多,自信心也很足,經常做一些很古怪的 表情,還時不時的做出經典的兔子手勢來表達他的意思。可以說他的演講還是很值得一聽的。

      但是總體想起來,Gavin貌似已經走進一個漩渦,那麼就是標準。估計在整個下午(演講1個小時和對幾個人的回答)估計他說了10次“Standard”這個詞,在他眼裏標準已經佔據了一切,有人問,使用Hibernate和JPA,你有什麼看法?他會說我不在意,他們都是標準。一切盡在標準中,他無視Spring、ROR的強有力挑戰,甚至想將JBoss Seam這樣的東西納入JSF、EJB陣營。他如此走下去真是難以讓人對他重現Hibernate的驚世之作有更多的期待。

二、Robbin傾力奉送Hibernate性能調優

     個人認爲這個絕對是Robbin壓箱底的作品(因爲很激動能邀請到Gavin參加他主辦的活動),但是Robbin還是很謙虛的首先聲明:在Gavin面前談Hibernate真是班門弄斧,所以是拿出來和大家探討,而當晚就有針對其演講中如何避免N+1問題的討論(http://www.iteye.com/post/266972),足見Robbin演講受歡迎的程度。

     由於Robbin爲了搶時間,所以他講的比較快,我也是急急忙忙的記筆記,但是他所總結的東西已經讓我瞭解到了很多東西,原來我對Hibernate的瞭解還是那麼少:(。

Robbin總結的Hibernate性能優化要點:

1.儘量使用many-to-one,避免使用單項one-to-many
2.靈活使用單向one-to-many
3.不用一對一,使用多對一代替一對一
4.配置對象緩存,不使用集合緩存
5.一對多使用Bag 多對一使用Set
6.繼承使用顯示多態  HQL:from object  polymorphism="exlicit" 避免查處所有對象
7.消除大表,使用二級緩存
    對於上面這些,Robbin進行了詳細的講解。
one-to-many:
     使用inverse=false(default),對象的關聯關係是由parent對象來維護的
     而inverse=true的情況下,一般用戶雙向多對多關聯,由子對象維護關聯關係,增加子對象的時候需要顯示:child.setParent(child)
     爲了提高性能,應該儘量使用雙向one-to-many inverse=true,在MVC結構中的DAO接口中應該直接用Session持久化對象,避免通過關聯關係(這句話有點不理解),而在單項關係中正確使用二級緩存,則可以大幅提高以查詢爲主的應用。
     多對一性能問題比較少,但是要避免經典N+1問題。
     通過主鍵進行關聯,相當於大表拆分小表。(這個是區分面向對象設計和麪向過程設計的一個關鍵點)
list、bag、set的正確運用
     one-to-many:
     A、使用list 需要維護Index Column字段,不能被用於雙向關聯,而且必須使用inverse=false,需要謹慎使用在某些稀有場合(基本上是不予考慮使用)
     B、bag/set在one-to-many中語義基本相同,推薦使用bag
     many-to-one:
     A、bag和set不同,bag允許重複插入,建議使用set
在龐大的集合分頁中應該使用session.createFilter
    session.createFilter(parent.getChildren(),""),setFirstResult(0),setMaxResult(10))
避免N+1 參考(http://www.iteye.com/post/266972)
    在多對一的情況下,查詢child對象,當在頁面上顯示每個子類的父類對象的時候會導致N+1次查詢,需要採用下面的方法避免:many-to-one fetch="join|select"(該方法可能有問題)
inverse=true 無法維護集合緩存(還不是很理解集合緩存和對象緩存)
OLTP類型的web應用,可以羣集水平擴展,不可避免的出現數據庫瓶頸
    框架能降低訪問數據庫的壓力,採用緩存是衡量一個框架是否優秀的重要標準,從緩存方面看Hibernate
    A、對象緩存,細顆粒度,是針對表的級別,透明化訪問,因爲有不改變代碼的好處,所以是ORM提高性能的法寶
    B、Hibernate是目前ORM框架中緩存性能最好的框架
    C、查詢緩存
最後Robbin還針對大家經常出現的Hibernate vs iBatis的討論進行了一個總結:
   對於OLTP應用,使用ORM框架 而OLEB應用(不確定是什麼應用)最好採用JDBC或者其他方法處理
   Hibernate傾向於細顆粒度設計,面向對象,將大表拆分爲多個小表,消除冗餘字段,通過二級緩存提升性能。
  iBatis傾向於粗顆粒度設計,面向關係,儘量把表合併,通過Column冗餘,消除關聯關係,但是iBatis沒有有效的緩存手段。

   可以說Robbin的性能總結對於使用Hibernate的開發人員有着很重要的點撥作用。非常感謝他無私奉獻自己的經驗。

三、曹曉剛對於JBoss Seam的介紹

     曹大俠又一次露面了,首先的感覺就是他比上次JavaEye的活動瘦了些,更帥了 :)。而且在演講席間,是他一直與Gavin進行着交流,這位滿江紅的創辦者之一,想必他的英語水平和他的技術水平一樣的強。他說目前滿江紅正在進行JBoss Seam文檔的中文翻譯工作,進度爲50%。而此次演講的內容是介紹JBoss Seam,但是由於JBossSeam剛剛走向市場推廣,國內也鮮有應用,其實全球來講也沒有什麼大規模的成功案例,所以他的演講也使得大家有點陌生。而且他說自己也是在學習階段,呵呵。感覺上這次介紹不如上次JavaEye活動中他給我們帶來的基於Ajax開源報表項目有吸引力,但是也具備一定的價值。

     通過Gavin和曹曉剛的介紹,JBoss有啥好處我並不大瞭解,以及它是否具有挑戰主流架構模式都有待檢驗,但是我得到一些簡單的結論:JBoss Seam現階段我們還不需要花時間去了解。

     原因有一下幾點,實際上就是曹曉剛介紹的東西:

     1.JBoss Seam引入了一個全新的概念:declared state,就是在傳統的HTTP存儲對象的組件外又加入了Conversation這個東西。(這裏記錄好像有錯誤,因爲我對JBoss Seam一無所知)
     2.JBoss Seam目前只支持JSF,可能是JBoss團隊以Gavin爲首想討好SUN和衆多大廠商吧,居然緊密結合JSF,JSF多年來日子都沒好過過,不知道Seam這樣搞是爲了啥。
     3.JBoss Seam添加了衆多組件的支持,比如Ajax支持、Captcha支持、類似於Rails的Gen支持。說50行就可以完成一個什麼實現的。
     4.BiInjection(雙向注入依賴,一個Seam的創新,也值得質疑的東西) and contextual are the soul of Seam,這是一個Seam的開發者對Seam的總結,但是這兩個東西都難有說服力,不知道什麼樣的場景需要大量使用到他們,特別是雙向關聯,可能會造成相當大的迷惑哦。

一個非常精彩的技術之旅,感謝JavaEye提供這樣的好機會,也感謝Gavin精彩的演講 :P。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章