我有一種方法在使用Hibernate默認的可遍歷解析器驗證實體列表時,可能會對數據庫進行大量調用。如果我註釋@Transactional,它的運行速度將快四倍。幾個問題:爲什麼Spring的@Transactional幫助性能
1)爲什麼它更快?
2)我怎樣才能複製速度增加,而不使方法事務?我完全不需要在交易中包裝這種方法,而使交易與方法的真實意圖不符。
我有一種方法在使用Hibernate默認的可遍歷解析器驗證實體列表時,可能會對數據庫進行大量調用。如果我註釋@Transactional,它的運行速度將快四倍。幾個問題:爲什麼Spring的@Transactional幫助性能
1)爲什麼它更快?
2)我怎樣才能複製速度增加,而不使方法事務?我完全不需要在交易中包裝這種方法,而使交易與方法的真實意圖不符。
我相信發生了什麼是您的數據庫邏輯需要一個事務。如果有事務正在進行,例如由於Spring根據您的註釋創建了一個事務,這些操作將加入它。如果沒有正在進行的交易,他們將不得不經歷獲得連接,開始交易以及可能在每次通話中設置Hibernate會話的過程。
這與您的方法意圖有什麼不一致?
也許事務性更改數據庫寫入的數量(減少它)?您可以打開底層sql命令的調試日誌記錄以查找。 – Kevin 2012-02-13 16:14:36
這是一個只讀的情況。但我可以這麼說,它似乎並沒有減少Hibernate的遍歷解析器實例化的次數,但它確實減少了每次實例化之間的時間量。 – Derek 2012-02-13 16:20:45
我認爲它與hibernate會話有關 - 您必須確保只有一個爲所有呼叫創建,因爲它是一個非常昂貴的對象。使用'@Transactional'始終是這種情況,如果沒有,您可以用OpenSessionInView過濾器手動執行,也可以使用其他方法。也沒有理由真的避免'@ Transactional'。 – mrembisz 2012-02-13 16:49:09