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 wwwjavaeyecom 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/29060.html