簡體   English   中英

Spring @Transactional是否使用任何Hibernate緩存?

[英]Does Spring @Transactional use any Hibernate cache?

@Transactional
public MyEntity getEntity(long id) {
    return dao.findOne(id);

    //or select and update as well
}

每次調用事務方法時:我是否會從hibernate獲取任何緩存實體(第一次除外)? 或者我是否總是從DB獲取新鮮的實體?

這很重要,因為我將有兩個獨立的應用程序將共享相同的數據庫,我想確保hibernate不返回任何緩存的實體,而另一個應用程序可能已經在后台更新了DB中的相同實體。

如果這是服務層的事務邊界,那么Hibernate將創建一個新的Session,這意味着第一級緩存中沒有任何內容。 如果您嘗試在同一服務方法中調用兩次findOne方法,則第二次調用將從緩存中獲取實體。

連續的服務方法調用(例如getEntity)總是以新的Hibernate會話結束,因此從數據庫加載一個新的實體。

如果您使用二級緩存並為此實體激活它,那么Hibernate將始終首先點擊緩存並在緩存未命中時回退到數據庫加載。

要防止數據完整性異常,請考慮使用樂觀鎖定

簡短的回答是肯定的。
答案很簡單:@Transactional所做的就是為你提供一個休眠會話,並開始/提交一個事務,如果配置的話。 它不關心會話是否啟用了緩存。 緩存由會話在內部完成。
所以你需要的是理解hibernate緩存:
默認情況下啟用一級緩存(每個會話),您無法禁用它,
默認情況下,二級緩存(每個SessionFactory)是禁用的,請參見此處如何啟用Ehcache(只有@Cache帶注釋的實體最終在二級緩存中)。
無論@Transactional是打開新會話,還是將重用現有會話,都是可配置的,它取決於CurrentSessionContext實現。 您可以插入自己的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM