当前有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)
,能够得到新数据。请教原理和解决办法。
认证0级讲师