当前有A和B两个程序,A使用SpringBoot和JPA
功能如下:
A是个API服务,A通过消息队列向B发送操作命令,阻塞轮询等待B完成后更新数据库,A读取数据库得到最新状态并返回
A没有启用缓存
现在的问题是,当B更新数据库后,A得到的一直都是旧数据,只有重新请求该API,才能得到新数据。
伪代码如下:
sendCommand(); Futurefuture = 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)
,能够得到新数据。请教原理和解决办法。