gpt4 book ai didi

java - 在 JpaRepository (Spring Data) 中缓存方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:09 26 4
gpt4 key购买 nike

工具: Spring 启动:1.5.9.RELEASESpring-Data-JPA:1.11.9.RELEASE

问题:目前我有一个从 JpaRepository 扩展的存储库。为了避免频繁访问DB,我想在JpaRepository中缓存一些CRUD方法。我在 Mr.Google 上尝试了几种方法,但除了一种方法外,其他方法都不起作用。

已编辑 1、本link中提到的解决方案是可行的。但是,这里有一个不好的做法(对我来说是冗余的)。想象一下,如果我有 50 个存储库扩展 JpaRepository,这意味着我必须重写 50 个存储库中的保存方法。

     public interface UserRepository extends CrudRepository<User, Long> {
@Override
@CacheEvict("user")
<S extends User> S save(S entity);

@Cacheable("user")
User findByUsername(String username);
}

已编辑 2.扩展JpaRepository接口(interface)。我在 link2 看到了一些可能有用的东西.

在链接中,它提到了 3 种不同的方法来缓存 JpaRepository 方法。第一种方法与我在#1 中提到的相同。但是,我想要类似于第二种/第三种方法的东西,这样我就不需要在所有存储库中重复覆盖 CRUD 方法

下面是我写的一些示例代码。

    @NoRepositoryBean        
public interface BaseRepository<T, ID extends Serializable> extends
JpaRepository<T, ID> {

@CacheEvict
<S extends User> S save(S entity);

@Cacheble
T findOne(ID id);
}

@Repository
@CacheConfig("user")
public interface UserRepository extends BaseRepository<User, Integer> {
// when I calling findOne/save method from UserRepository, it should
// caching the methods based on the CacheConfig name defined in the
// child class.
}

但是,似乎代码(以上)无法正常工作,因为我遇到了异常。我知道这个问题的发生主要是因为没有名称被分配给 BaseRepository 中的可缓存注释。但是我需要在从 JpaRepository 扩展的 BaseRepository 中缓存 CRUD 方法。

java.lang.IllegalStateException: No cache could be resolved for 'Builder[public abstract java.util.List com.sdsap.app.repository.BaseRepository.findAll()] caches=[] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'' using resolver 'org.springframework.cache.interceptor.SimpleCacheResolver@30a9fd0'. At least one cache should be provided per cache operation.

我已经问了 Mr.Google 好几天了,但找不到任何合适的解决方案。我希望有人可以在这里帮助我。抱歉,如果我的问题不清楚或遗漏了什么,因为这是我第一次在这里发帖。谢谢!

最佳答案

我假设您已经设置了所需的配置,并且您发布的堆栈跟踪是问题所在。所以让我们来挖掘它。

我看到了两个问题:

  1. java.lang.IllegalStateException: No cache could be resolved, At least one cache should be provided per cache operation.

    解决方案:每当您想要缓存数据或逐出数据时,您必须提供缓存的名称,我没有在您的代码中看到它。

    @Cacheable's cacheNames or value应该定义以使缓存工作。

    示例:@Cacheable(value = "usersCache")

  2. 正确的缓存键

    因为缓存在 key-value 对上工作,所以你应该提供一个合适的缓存键。如果您不提供缓存键,则默认情况下,默认键生成策略会创建一个 SimpleKey,其中包含调用该方法时使用的所有参数。

建议:您应该手动提供缓存键。

示例:

@Cacheable(value = "usersCache", key = "#username")
User findByUsername(String username);

注意:确保用户名是唯一的,因为缓存键必须是唯一的。

您可以阅读更多 Spring cache annotations: some tips & tricks

关于java - 在 JpaRepository (Spring Data) 中缓存方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49973018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com