2012-02-13 79 views
0

我有一種方法在使用Hibernate默認的可遍歷解析器驗證實體列表時,可能會對數據庫進行大量調用。如果我註釋@Transactional,它的運行速度將快四倍。幾個問題:爲什麼Spring的@Transactional幫助性能

1)爲什麼它更快?

2)我怎樣才能複製速度增加,而不使方法事務?我完全不需要在交易中包裝這種方法,而使交易與方法的真實意圖不符。

+1

也許事務性更改數據庫寫入的數量(減少它)?您可以打開底層sql命令的調試日誌記錄以查找。 – Kevin 2012-02-13 16:14:36

+0

這是一個只讀的情況。但我可以這麼說,它似乎並沒有減少Hibernate的遍歷解析器實例化的次數,但它確實減少了每次實例化之間的時間量。 – Derek 2012-02-13 16:20:45

+3

我認爲它與hibernate會話有關 - 您必須確保只有一個爲所有呼叫創建,因爲它是一個非常昂貴的對象。使用'@Transactional'始終是這種情況,如果沒有,您可以用OpenSessionInView過濾器手動執行,也可以使用其他方法。也沒有理由真的避免'@ Transactional'。 – mrembisz 2012-02-13 16:49:09

回答

1

我相信發生了什麼是您的數據庫邏輯需要一個事務。如果有事務正在進行,例如由於Spring根據您的註釋創建了一個事務,這些操作將加入它。如果沒有正在進行的交易,他們將不得不經歷獲得連接,開始交易以及可能在每次通話中設置Hibernate會話的過程。

這與您的方法意圖有什麼不一致?

+0

邏輯不是事務性的 - 我不需要任何原子性 - 它只是通過一堆實體循環來查看它們是否已經在數據庫中。該方法的目的僅僅是檢查以確保所有傳入的實體都不在數據庫中。如果方法是@Transactional,它將被標記爲RollbackOnly,並且無法按照我想要的方式繼續。 – Derek 2012-02-13 17:52:40

+0

爲什麼你不想檢查並插入相同的事務?這是所需事務隔離的教科書案例。 – Olaf 2012-02-13 18:38:58

相關問題