2011-07-17 18 views
11

如果我們有具有最佳方式

  • 重UI Web應用程序(Spring MVC的+ JQuery的使用JSON)
  • 休眠與JPA註釋是域模型
  • 延伸Spring提供DAO到碼DAO層
  • JBOSS是與Oracle應用服務器作爲後端
  • 數據源(JNDI)基於連接池(不是XA,而本地數據SOU RCE)
  • 還可以訪問多個數據源(處理多個DB)

在行爲上,很多數據檢索(70%)和數據的更新爲30%的
什麼是最好的做法以下是爲了有效地使用數據庫連接,還要看到連接使用時沒有太多泄漏?

  1. 選擇基於Hibernate模板的DAO會更好嗎?
  2. 什麼樣的事務管理器將被建議 - 我們應該去基於AOP的事務管理在哪裏
  3. 在哪裏實例化會話以及在哪裏關閉會話以有效地使用來自連接池的連接。確實,我們需要處理來自服務層的事務,但會話會發生什麼,他們會等待更長的時間(我們沒有使用任何opensessioninviewFilter)
  4. 哪一層更好地處理檢查的異常(業務異常)和運行時異常。

對不起,這是一個比較長的問題,但是我看到這是一個常見的查詢,我試圖整合它。感謝您的耐心和指導。謝謝你的幫助。

+0

如果我們計劃在後端使用數據庫分區(表範圍/散列分區),該怎麼辦? Hibernate(或碎片?尚未投入生產!)支持嗎? –

回答

2
  • 直接在您的DAO中使用JPA EntityManager。一定不要將其標記爲擴展
  • 身高:<tx:annotation-driven />@Transactional - 僅在服務層
  • 事務管理器也打開和關閉會話(如果沒有在線程中已經存在)。這裏最好知道會話是每個請求會話。每個請求(=線程)都有一個單獨的會話實例。但是隻有在需要時才創建數據庫連接,因此即使在所有方法周圍都有事務管理器,也不會打開不必要的連接。
  • 只讀事務 - 使用情況@Transactional(readOnly=true)時,只有數據檢索
  • 緩存 - 利用Hibernate的二級緩存把實體在內存中(而不是從數據庫中每一次讀取它們)
  • 避免OpenSessionInView和懶惰的集合。這是主觀的,但在我看來,所有離開服務層的對象都必須被初始化。對於小集合(例如角色列表),您可以擁有渴望的集合。對於更大的集合使用HQL查詢。
+0

我同意這是標準的。如果我們在EntityManager的性能或資源利用方面有任何其他優勢,請您區分一下。另外如果我們想要支持數據庫表水平分區,那麼推薦的技術是什麼? –

+0

相同。如果你最終需要原始的hibernate會話甚至是連接,你可以通過'entityManager.unwrap(Session.class)' – Bozho

15

這聽起來像一個非常典型的春/ Hibernate應用程序,所以我會建議下列當前的最佳實踐,這是我最近在another answer概述。具體做法是:

  1. 擴展Spring DAO支持類或使用的HibernateTemplate。將@Repository註釋與分量掃描結合使用,並將directly inject the SessionFactory納入您的DAO。
  2. 使用Spring的HibernateTransactionManager,並通過@Transactional明確使用declarative transaction management作爲默認方法。
  3. Spring manage that。它會在默認情況下及時打開會話,但更喜歡Spring的OpenSessionInViewFilter啓用的open session in view pattern
  4. 參見#3。
  5. 總是處理應該處理的異常 - 換句話說,這是一個設計決定。但是,請注意,Spring事務框架默認爲rolls back on unchecked exceptions,但未檢查,以匹配EJB規範的行爲。確保在使用檢查的例外的任何地方設置適當的回滾規則(請參閱上一個鏈接)。

此外,顯然使用連接池。 Apache Commons DBCP是一個不錯的選擇。 「連接使用量沒有太多泄漏」是不夠的。你必須有零連接泄漏。依靠Spring來管理你的資源將有助於確保這一點。至於其他任何性能問題,請勿嘗試過早優化。等到你看到你的問題所在的地方,然後找出解決每個問題的最佳方法。由於您的瓶頸很可能與數據庫相關,請查看Hibernate參考的the performance chapter以瞭解您所面臨的問題。它涵蓋了緩存和獲取策略的重要概念。

+0

+1得到。+好的相關信息集合。 –

+0

我更喜歡EntityManager到SessionFactory,儘管 – Bozho

+0

@Bozho:你使用的並不重要,儘管我從來沒有聽說過使用EntityManager的令人信服的理由。 –