我有一堆JPA DAOs即將遷移到Spring Data JPA。我的一些DAOS設置了二級/查詢緩存。如何使用二級緩存將我的JPA DAO遷移到Spring Data?
我有一個過程,我只在我的查詢中檢索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…
- 方法,都做這樣的。這感覺是保持緩存內存消耗降低的好方法。
我對Spring Data JPA業務很陌生,但我不明白我會如何去實現這一點? @Cacheable
註解似乎只是爲了處理查詢緩存,這對我來說會複製每個查詢緩存中的實體?
有沒有辦法用Spring Data做到這一點?指針將非常感激。
'@ Cacheable'與查詢或二級緩存無關。它是關於緩存方法調用的結果,並且可以使用或不使用hibernate。例如,您也可以使用它來緩存長計算的結果。此外,您的代碼似乎不必要地複雜,爲什麼不簡單地返回'SystemUser'而不是執行2個查詢,您可能已經觸發了單個查詢。看起來像一個不成熟的優化出錯了? –
假設我在Systemuser中有5個方法,都在執行「findby ...」不同的參數,所有緩存。使用我的解決方案,只有ID存儲在每個查詢緩存中,並且只有一個'full'系統用戶實例存儲在第二級緩存中,所有5個方法將通過findById檢索。我希望這是有道理的。 – Mathias