2010-04-01 281 views
23

只需要您對Spring的聲明式交易管理的專家意見。這裏是我的設置:春季 - 只讀交易

  1. DAO層是普通的舊JDBC使用Spring的JdbcTemplate(無休眠等)
  2. 服務層是POJO與聲明式事務如下 - save*, readonly = false, rollback for Throwable

事情很好地工作以上設置。但是,當我說get*, readonly = true時,我在我的日誌文件中看到錯誤,說Database connection cannot be marked as readonly。這發生在服務層的所有get *方法中。

現在我的問題是:

A.我必須設置get*爲只讀?我所有的get*方法都是純讀取數據庫操作。我不希望在任何事務環境中運行它們。上述錯誤有多嚴重?

B.當我刪除get*配置時,我看不到錯誤。另外,我所有的簡單的get*操作都是在沒有事務的情況下執行的。這是要走的路嗎?

C.爲什麼任何人想要有交易方法readonly = true?這個配置有什麼實際意義嗎?

謝謝!一如既往,您的反應非常感謝!

回答

23

This post說明行爲或readOnly標誌是持久性機制相關的。

C.是,使用Hibernate時,通過沖洗模式設置爲FLUSH_NEVER(如鏈接後述)

B.是,JDBC調用不需要交易提供了性能優勢(休眠需要一個),因此刪除@Transactional配置會修整所有事務管理。

A.我認爲春天是調用connection.setReadOnly(true)但你的JDBC驅動程序不支持此

的底線是:不使用readonly交易與普通的JDBC。

而另一件事 - 交易應該跨越多個查詢。不要讓你的交易過於細化。讓他們a unit of work

+0

謝謝Bozho!當天清除。我想我將使用普通JDBC刪除get *配置。 – AAK 2010-04-01 20:19:09

+1

如果沒有隻讀事務,您也可以打開自己的'org.hibernate.LazyInitializationException'。 – HDave 2014-11-12 21:15:10

+0

以何種方式可以避免org.hibernate.LazyInitializationException,同時起訴waffle身份驗證管理器。 – 2015-08-27 13:53:19

5

答:我必須說*獲取只讀嗎?我所有的get *方法都是純讀取數據庫操作。我不希望在任何事務環境中運行它們。上述錯誤有多嚴重?

實際上,您可能仍然希望在事務上下文中運行所有的get(),以確保您獲得一致的讀取。另一方面,如果您不關心這一點,則可以相應地設置交易級別。

C.爲什麼任何人想要事務性方法readonly = true?這個配置有什麼實際意義嗎?

  1. 爲了幫助防止錯誤的寫GET內()`方法
  2. 爲了優化目的。正如Bozho提到的,Hibernate不僅可以使用這些信息,還可以使用一些數據庫/ JDBC驅動程序來使用這些信息。
+0

謝謝你馬特!我想我的get *方法非常簡單,獨立的SQL select查詢,我沒有使用Hibernate,所以我會關閉設置。 – AAK 2010-04-01 20:20:23