【问题标题】:Spring Data Redis. JPA Repository findBy sometimes fails to fetch existing record春季数据 Redis。 JPA Repository findBy 有时无法获取现有记录
【发布时间】:2021-06-28 09:54:13
【问题描述】:

我看到了一些奇怪的情况。有时我的 findBy...() 方法返回 null 而不是之前成功插入和获取的某个对象。之后,所需的对象就很好了。换句话说,有时搜索不起作用。

Spring Boot 版本:1.5.2.RELEASE

spring-boot-starter-data-redis: 1.5.22.RELEASE

“maxmemory-policy”设置为“noeviction”

我的 obj 声明:

@RedisHash("session")
public class Session implements Serializable {

    @Id
    private String id;

    @Indexed
    private Long internalChatId;
    @Indexed
    private boolean active;
    @Indexed
    private String chatId;
}

JPA 存储库:

@Repository
public interface SessionRepository extends CrudRepository<Session, String> {

    Session findByInternalChatIdAndActive(Long internalChatId, Boolean isActive);
}

Redis 配置:

@Bean
    public LettuceConnectionFactory redisConnectionFactory(
        RedisProperties redisProperties) {
        return new LettuceConnectionFactory(
            redisProperties.getRedisHost(),
            redisProperties.getRedisPort());
    }

    @Bean
    public RedisTemplate<?, ?> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<byte[], byte[]> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        return template;
    }

感谢任何帮助。

【问题讨论】:

    标签: spring spring-boot redis spring-data-jpa spring-data


    【解决方案1】:

    我们最近看到了类似的行为。在我们的场景中,我们可以有多个线程读取和写入同一个存储库。当一个线程正在对一个对象进行保存而另一个线程正在对同一对象执行 findById 时,我们的 null 返回发生。 findById 偶尔会失败。看来 save 实现先删除,然后再添加;如果在删除过程中findById进入,则返回null结果。

    到目前为止,我们的测试程序很幸运,它可以使用 Java 信号量来重现空返回,从而控制对存储库的所有访问(读取、写入、删除)。当存储库访问方法都由同一个信号量控制时,我们没有看到 null 返回。我们的下一步是尝试将 synchronized 关键字添加到访问存储库的类中的方法中(作为使用信号量的替代方法)。

    【讨论】:

    • 感谢您的提示!似乎有道理。在这个假设下,我将获得更接近的战利品
    【解决方案2】:

    这不应该发生我不知道是什么原因。但是你可以使用 Option 类,如果它返回 null 至少你可以避免异常。 比如:

        Optional<Session> findByInternalChatIdAndActive(Long internalChatId, Boolean isActive);
    

    【讨论】:

    • 感谢您的建议,但它确实发生了(添加 Optional 不是解决方案,因为某些逻辑取决于持久会话。我至少需要找出为什么会发生这种情况
    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 2013-11-12
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多