spring数据redisjpa存储库findby有时无法获取现有记录

72qzrwbm  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(444)

我看到一些奇怪的案子。有时我的findby…()方法返回null,而不是以前成功插入和获取的某个对象。在那之后,所需的对象会很好地获取。换言之,有时搜索不起作用。
spring boot版本:1.5.2.0版本
spring boot starter数据redis:1.5.22.release
“maxmemory policy”设置设置为“noeviction”
我的目标声明:

@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;
    }

任何协助都要提前通知他。

bis0qfac

bis0qfac1#

我们最近也看到了类似的行为。在我们的场景中,可以有多个线程读写同一个存储库。当一个线程对一个对象执行保存操作,而另一个线程对同一个对象执行findbyid操作时,就会出现null返回。findbyid偶尔会失败。似乎save实现先删除,然后添加;如果findbyid在删除过程中进入,则返回null结果。
到目前为止,我们的测试程序很幸运,它可以使用java信号量对存储库的所有访问(读、写、删除)进行选通,从而重现null返回。当存储库访问方法都被同一个信号量选通时,我们没有看到null返回。我们的下一步是尝试将synchronized关键字添加到类中访问存储库的方法中(作为使用信号量的替代方法)。

siv3szwd

siv3szwd2#

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

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

相关问题