當前有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)
,能夠得到新數據。請教原理和解決辦法。