当前有A和B两个程序,A使用SpringBoot和JPA
功能如下:
A是个API服务,A通过消息队列向B发送操作命令,阻塞轮询等待B完成后更新数据库,A读取数据库得到最新状态并返回
A没有启用缓存
现在的问题是,当B更新数据库后,A得到的一直都是旧数据,只有重新请求该API,才能得到新数据。
伪代码如下:
sendCommand();
Future<Boolean> future = pool.submit(() -> {
    while (condition) {
        MyObj obj = myRepository.findOne(id);  //这里倒是可以取到新数据,不在同一线程的缘故?
        sleep(1000);
        if (obj.getStatus() == newStatus) 
            return true;
        }
    return false;
});
if (future.get(timeout, TimeUnit.SECONDS))
    myRepository.findByName(name);  //这里取到的总是旧数据,而实际上数据库已经更新了请问这是什么原因,该如何解决
我假设myRepository.findByName(name)在我不知情的情况下使用了缓存,曾经试过myRepository.findByNameAndTime(name,time),让time每次都不同,让缓存不起作用,结果发现结果还是旧的。
补充:
后来又试了一下,另起一个线程来执行myRepository.findByName(name),能够得到新数据。请教原理和解决办法。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
认证0级讲师