簡體   English   中英

Hibernate 緩存與 spring 緩存

[英]Hibernate cache vs spring cache

誰能解釋 hibernate 二級緩存與 spring 緩存有什么區別。

在單個應用程序中同時使用兩者是否有意義? 如果不推薦,那么何時使用哪一個?

如果有人給出基於現實生活場景的解釋,它可以幫助您輕松理解。

這是兩種完全不同的技術。 當您使用關系數據庫時,Hibernate 和 Hibernate 緩存通常適用。 Then you can use Hibernate ORM to generate queries, store objects, etc. The domain model is written in java (entities). 有時將其中一些實體緩存在 memory 中以加快查詢速度是有意義的,因此您可以使用 Hibernate 緩存來緩存它們。 那里有很多不同類型的緩存,我不會深入細節,因為這是一個普遍的問題,但如果你想了解更多關於 Hibernate 緩存的信息,請閱讀 這里

Now spring caching is done by Spring and in general, it has nothing to do with the Relational Databases/ JDBC world, in other words outside the realm of Hibernate. 您可以緩存 object 以避免,例如,調用 MongoDb,或避免進行兩次昂貴的計算。 您可以將數據緩存在 memory 或更高級的分布式技術中,例如 Hazelcast、Redis 或 Infinispan(還有其他)。

在這里您可以找到 Spring 緩存的介紹材料。 是一種更完整的官方文檔

所以是的,要直接回答你的問題,在一個應用程序中使用兩者可能是有意義的:) 我真的認為你應該熟悉兩者,至少在概念和目標層面,然后決定什么適用於你的情況。

它們的主要區別之一是 hibernate 二級緩存將在緩存實體有任何更新或刪除時自動幫助維護緩存的實體,而 Spring 緩存是一種更通用的緩存,它對 ZF8CB4B31358F17FA37CFAE6C2 一無所知在這種情況下手動過時的緩存實體。

此外,由 Hibernate 二級緩存緩存的實體將由它管理,而在 spring-cache 中它將被分離。 如果您不熟悉它,處理分離的實體並不容易

使用兩個緩存是否有意義總是取決於上下文。 對我來說,使用 Hibernate 二級緩存需要一些學習曲線才能正確使用它。 Spring 緩存由於其通用性而更加靈活,但需要您自己完成更多工作。

我會首先使用 Hibernate 二級緩存,因為一旦你掌握了它,它就需要做更少的事情。 如果遇到 Hibernate 不支持配置我想要的緩存行為的情況,請考慮使用 Spring 緩存。

我的真實例子是我有一些后台數據清理任務,需要執行一些本機查詢,這些查詢從二級緩存中刪除所有實體,這反過來會影響我的 hibernate 查詢緩存之一。 由於本機查詢非常復雜,即使使用此處提到的提示,我也無法控制不使緩存無效。 所以我改為使用 Spring 緩存來緩存該查詢結果。

他們完全不同

  1. hibernate 二級

Hibernate二級緩存用在Hibernate的上下文中,所以所有的session共享同一個實例。 默認情況下它是禁用的,為了使用它,你應該像這樣啟用它:

hibernate.cache.use_second_level_cache=true

為了使實體符合二級緩存的條件,我們使用 Hibernate 特定的 @org.hibernate.annotations.Cache 注釋對其進行注釋,並指定緩存並發策略。

一些開發人員認為添加標准 @javax.persistence.Cacheable 注釋也是一個很好的約定(盡管 Hibernate 不需要),因此實體 class 實現可能如下所示:

例子

@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private long id;

    @Column(name = "NAME")
    private String name;
    
    // getters and setters
}
  1. Spring緩存

if Hibernate second level cache is used for caching instance of JPA entities and query result, spring cache aimed to cache spring beans.

例子

@Cacheable("addresses")
public String getAddress(Customer customer) {...}

getAddress() 調用將在實際調用方法之前首先檢查緩存地址,然后緩存結果。

我希望我的解釋很清楚

暫無
暫無

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

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