我正在爲客戶端的數據庫應用程序工作。舊的應用程序代碼在訪問數據庫的方式上很不一致;在一些方法中它使用Hibernate對象,在另一些方法中直接創建JDBC連接並使用純SQL,在一些方法中它創建Hibernate連接並使用它們來獲得JDBC連接。無論如何,我們將檢修大量代碼以保持一致。我們的客戶聽說過JPA,並要求我們使用它,因爲客戶相信它會帶來性能優勢。JPA的EntityManager何時可以通過普通JDBC提供性能優勢?
問題是,我對JPA的性能好處的理解是JPA的EntityManager帶來的巨大好處,因爲它允許您在數據庫調用之間持久保存內存中的對象。但是,我們正在處理的應用程序不是唯一訪問數據庫的應用程序,並且會在多個位置的多個實例中運行。此外,EntityManagers aren't thread-safe因此我們甚至無法在同一個應用程序的不同部分看到更改的數據。因此,看起來我們需要從每個方法中的EntityManagerFactory獲取新的EntityManager,並在方法完成時關閉它。因此,我們實際上不能長時間堅持內存中的對象,因爲其他應用程序需要我們更改我們需要的數據的數據。
目前的代碼非常混亂,移植到JPA會給可維護性和一致性帶來重大好處。但是,如果它不提供性能優勢,我們應該儘快讓客戶知道,這樣他們就不會失望。 JPA除了與持久性上下文有關的顯而易見的方面還有其他的方法嗎?
我檢查了StackOverflow上的其他問題,但是我發現了關於大批量變更的討論(example here)。我們的客戶希望一個應用程序所做的更改能夠儘快顯示給其他應用程序,因此我們的應用程序將進行一些小的更改,而不是偶爾進行批量更改。
謝謝。
請注意,任何形式的表現,你可能會間接引用(執行速度,開發維護方便,代碼質量,便攜性)不屬於JPA的屬性。他們按照慣例完全由開發商控制;它非常依賴於你作爲工程師的技能以及設計適當軟件架構的能力,如果它實際上對你有很大的幫助或者極大的阻礙。例如,如果您打算使用JPA來處理相關數據庫,則您已經處於不穩固的狀態。存儲過程和普通的JDBC仍然有它們的位置。 – Gimby
因爲其他應用程序需要讀取數據庫,所以我不認爲你會得到很大的性能提升,因爲你的JPA代碼將不得不[flush](http://docs.oracle.com/javaee/6/ api/javax/persistence/EntityManager.html#flush%28%29)。但是,獲得的巨大收益將在開發階段:維護JPA代碼比維護顯式JDBC容易得多。您甚至可以使用[驗證約束](http://docs.oracle.com/javaee/6/api/javax/validation/constraints/package-summary.html)。 – VGR