熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Hibernate性能調優

2013-11-23 20:22:09  來源: Java開源技術 

  inverse = ?

  inverse=false(default)

  用於單向onetomany關聯

  parentgetChildren()add(child) // insert child

  parentgetChildren()delete(child) // delete child

  inverse=true

  用於雙向onetomany關聯

  childsetParent(parent) sessionsave(child) // insert child

  sessiondelete(child)

  在分層結構的體系中parentDao childDao對於CRUD的封裝導致往往直接通過session接口持久化對象而很少通過關聯對象可達性

  To be the best IT community

  onetomany關系單向關系還是雙向關系?

  parentgetChildren()add(child)對集合的觸及操作會導致lazy的集合初始化在沒有對集合配置二級緩存的情況下應避免此類操作l select * from child where parent_id = xxx性能口訣

  一般情況下避免使用單向關聯盡量使用雙向關聯l 使用雙向關聯inverse=true

  在分層結構中通過DAO接口用session直接持久化對象避免通過關聯關系進行可達性持久化

  To be the best IT community

  manytoone關系

  單向manytoone表達了外鍵存儲方靈活運用manytoone可以避免一些不必要的性能問題

  manytoone表達的含義是……n many可以是可以是也可以是n也就是說manytoone可以表達一對多一對一多對一關系因此可以配置雙向manytoone關系例如l 一桌四人打麻將麻將席位和打麻將的人是什麼關系?是雙向manytoone的關系To be the best IT community

  onetoone通過主鍵進行關聯相當於把大表拆分為多個小表例如把大字段單獨拆分出來以提高數據庫操作的性能Hibernate的onetoone似乎無法lazy必須通過bytecode enhancement To be the best IT community

  集合List/Bag/Set onetomany l List需要維護index column不能被用於雙向關聯必須inverse=false被謹慎的使用在某些稀有的場合l Bag/Set語義上沒有區別l 我個人比較喜歡使用Bag manytomany l Bag和Set語義有區別l 建議使用Set To be the best IT community

  集合的過濾l children = sessioncreateFilter(parentgetChildren() where thisage > and thisage < list()

  針對一對多關聯當中的集合元素非常龐大的情況特別適合於龐大集合的分頁l sessioncreateFilter(parentgetChildren()setFirstResult(setMaxResults(list()To be the best IT community

  繼承關系當中的隱式多態HQL from Object l 將把所有數據庫表全部查詢出來l polymorphism=implicit(default)將當前對象和對象所有繼承子類全部一次性取出l polymorphism=explicit只取出當前查詢對象To be the best IT community

  Hibernate二級緩存著名的n+問題from Child然後在頁面上面顯示每個子類的父類信息就會導致n條對parent表的查詢

  l select * from parent where id = ?

  l …

  l select * from parent where id = ?

  解決方案

  eager fetch

  二級緩存

  To be the best IT community

  inverse和二級緩存的關系當使用集合緩存的情況下

  inverse=false通過parentgetChildren()來操作Hibernate維護集合緩存l inverse=true直接對child進行操作未能維護集合緩存!導致緩存髒數據

  雙向關聯inverse=true的情況下應避免使用集合緩存To be the best IT community Hibernate二級緩存是提升web應用性能的法寶OLTP類型的web應用由於應用服務器端可以進行群集水平擴展最終的系統瓶頸總是逃不開數據庫訪問哪個框架能夠最大限度減少數據庫訪問降低數據庫訪問壓力哪個框架提供的性能就更高

  針對數據庫的緩存策略

  對象緩存細顆粒度針對表的記錄級別透明化訪問在不改變程序代碼的情況下可以極大提升web應用的性能對象緩存是ORM的制勝法寶

  對象緩存的優劣取決於框架實現的水平Hibernate是目前已知對象緩存最強大的開源ORM

  查詢緩存粗顆粒度針對查詢結果集應用於數據實時化要求不高的場合To be the best IT community應用場合決定了系統架構一是否需要ORM Hibernate or iBATIS?

  采用ORM決定了數據庫設計

  Hibernate

  傾向於細顆粒度的設計面向對象將大表拆分為多個關聯關系的小表消除冗余column通過二級緩存提升性能(DBA比較忌諱關聯關系的出現但是ORM的緩存將突破關聯關系的性能瓶頸)Hibernate的性能瓶頸不在於關聯關系而在於大表的操作

  iBATIS

  傾向於粗顆粒度設計面向關系盡量把表合並通過表column冗余消除關聯關系無有效緩存手段iBATIS的性能瓶頸不在於大表操作而在於關聯關系

  To be the best IT community性能口訣

  使用雙向一對多關聯不使用單向一對多

  靈活使用單向多對一關聯

  不用一對一用多對一取代

  配置對象緩存不使用集合緩存

  一對多集合使用Bag多對多集合使用Set

  繼承類使用顯式多態

  表字段要少表關聯不要怕多有二級緩存撐腰


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28385.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.