簡體   English   中英

如何使用二級緩存將JPA DAO遷移到Spring Data?

[英]How do I migrate my JPA DAO to Spring Data with second level cache?

我有一堆JPA DAO正在尋求遷移到Spring Data JPA。 我的一些DAOS設置了二級/查詢緩存。

我有一個進程,我只在查詢中檢索ID,然后使用findByID()查找實體。 這樣,只有id在不同的查詢緩存中相乘,並且整個實體都在二級緩存中。

例:

@NamedQuery(name = "SystemUser.findByEmail",
            query = "SELECT u.id FROM SystemUser u WHERE email=:email"),
…

public SystemUser findByEmail(String email) {

    TypedQuery<Long> q = getEntityManager().createNamedQuery("SystemUser.findByEmail", Long.class);
    q.setParameter("email", email);
    q.setHint("org.hibernate.cacheable", true);
    q.setHint("org.hibernate.cacheRegion", "query.systemUser");

    List<Long> res = q.getResultList();

    if (res != null && res.size() > 0) {
        return findById(res.get(0));
    }

    return null;
}

我有幾個findBy… -methods,都是這樣做的。 感覺這是保持緩存內存消耗的好方法。

我對Spring Data JPA業務有點新意,但我看不出我會如何實現這一點? @Cacheable注釋似乎只處理查詢緩存,這對我來說會復制每個查詢緩存中的實體?

有沒有辦法用Spring Data做到這一點? 指針將非常感激。

在Spring Data JPA中,只需創建一個findByEmail方法,Spring Data JPA將找到您的命名查詢或自己創建一個查詢。

public class SystemUserRepository extends CrudRepository<SystemUser, Long> {

    SystemUser findByEmail(String email);
}

應該只需要執行查詢和所需的結果。 現在使用@QueryHints您可以添加您現在正在設置的提示。

public class SystemUserRepository extends CrudRepository<SystemUser, Long> {

    @QueryHints(
        @QueryHint(name="org.hibernate.cacheable", value="true"),
        @QueryHint(name="org.hibernate.cacheRegion", value="query.systemUser")        )
    SystemUser findByEmail(String email);
}

結果將被緩存,用戶仍將來自二級緩存(如果可用,否則創建)。 假設您的實體當然是@Cacheable

可以在這里找到關於2個不同緩存如何工作(一起)的精彩讀物。 關於查詢緩存如何工作的小片段。

查詢緩存在概念上看起來像一個哈希映射,其中密鑰由查詢文本和參數值組成, 值是與查詢匹配的實體Id的列表

如果您想要更復雜的邏輯(並且真正實現您所做的優化),您始終可以實現自己的存儲庫

暫無
暫無

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

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