分享

如何使用二级缓存将JPA DAO迁移到Spring Data?

 印度阿三17 2019-10-28

我有一堆希望迁移到Spring Data JPA的JPA DAO.我的某些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…方法,所有方法都是这样.感觉这是降低缓存内存消耗的好方法.

我是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.

可以找到有关07个不同缓存如何一起工作的很好的读物here.有关查询缓存如何工作的小片段.

The query cache looks conceptually like an hash map where the key is composed by the query text and the parameter values, and the value is a list of entity Id’s that match the query:

如果您想要更复杂的逻辑(并真正实现您所做的优化),则始终可以实现own repository.

来源:https://www./content-4-529601.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多