当前位置: 首页 > 知识库问答 >
问题:

Spring JpaRepository未返回更新的数据[重复]

司徒骞尧
2023-03-14
@Controller
public class ClientController {
    @Autowired
    NodeRepository nodeRepository;
    ...
}

@Controller
public class NodeController {
    @Autowired
    NodeRepository nodeRepository;
    ...
}
public interface NodeRepository extends JpaRepository<Node, Long>{
    Node findByNodeId(long nodeId);
    List<Node> findByStatusIn(Set<String> status);
    List<Node> findByNodeIdIn(Set<Long> ids);
    Node findByPhoneNumber(String phoneNumber);
    Node findByCloudId(String cloudId);
    Node findByDeviceDescription(String deviceDescription);
}

行为如下:

ClientController接收到新请求时,将对其进行处理,控制器将请求发送到外部设备并等待其应答。
此应答由NodeController接收。因此,当答案到达时,接收到的信息将保存在数据库中,并向ClientController发送一个信号以唤醒它。

当这个控制器被唤醒并试图从数据库中检索更新的信息时,我的问题就来了。这些信息不是刚刚存储的信息,而是以前存储的信息。

// Retrieves the list of nodes that are going to be requested
requestedNodes = (List<Node>) nodeRepository.findAll();

System.out.println("BEFORE");
for (Node node : nodes)
    System.out.println(node.getNodeId() + ": " + node.getStatus());

// Sends a request to the nodes
// The Controller is blocked here until all answers have been received
fetchNodes(requestedNodes, DevicePing[0], null);

// Retrieves the list of nodes again
nodes = nodeRepository.findAll();

System.out.println("AFTER");
for (Node node : nodes)
    System.out.println(node.getNodeId() + ": " + node.getStatus());
BEFORE:
321: dead
1: dead
4: dead

AFTER:
321: dead
4: dead
1: dead

我已经检查了数据是否被正确地存储,它是正确的。在解锁ClientController之前,新数据在数据库中可用。

我还尝试使用存储库的JDBC intead检索新数据。在这种情况下,将正确检索新信息。因此,我认为它一定是与存储库相关的东西,但我找不到它是什么。可能存在一些缓存或刷新问题。我试图在保存新数据之后和检索新数据之前执行noderepository.flush(),但没有成功。

我希望有人能帮我。提前致谢

共有1个答案

鲁洋
2023-03-14

我终于找到了答案。这个问题确实与一些缓存问题有关。

Hibernate缓存使用函数nodeRepository.findAll()检索的实体,因此当我调用函数nodeRepository.findAll()时,它返回缓存的信息,而不是对数据库执行查询。

解决方案是在检索更新的数据之前,从EntityManager调用函数clear():

// Sends a request to the nodes
// The Controller is blocked here until all answers have been received
fetchNodes(requestedNodes, DevicePing[0], null);

// Clears the cache to avoid inconsistency
entityManager.clear();

// Retrieves the list of nodes again
nodes = nodeRepository.findAll();
 类似资料:
  • 问题内容: 每次我运行mysql_fetch_array时,返回带有重复值的数组, 例如 但我只想要数组中的单个结果,我尝试使用 但这没有区别。 问题答案: 这是的预期功能。如果您不希望有“重复项”,而只是具有关联数组,请改用。 例:

  • 问题内容: 我试图在扭曲的python中结合这两个查询: 和: 进入单个查询。有可能这样做吗? 我尝试将SELECT放在子查询中,但我不认为整个查询都会返回我想要的内容。 有没有办法做到这一点?(甚至更好,没有子查询)还是只需要坚持两个查询? 谢谢, 泉 问题答案: 您不能直接合并这些查询。但是您可以编写一个存储过程来执行两个查询。例:

  • 我在我的项目中集成了Firebase实时数据库。当活动打开时,我检查用户是否已经在数据库中检查,为此,我从调用方法。检查下面的代码。 问题:当数据插入firebase并在中回调/触发器时,如何更新/接收数据?

  • 我在jsf页面中使用primefaces惰性数据表,如下所示: 如您所见,dataTable上方有一个搜索面板,其中包含用户可以通过填充它们来缩小结果的参数。支持bean中的每个搜索字段都有一个对应的属性,如下所示。 当我按下“searchButton”时,后台bean得到更新,它包含用户输入的“searchField”值。但是,当我尝试使用“recordId”列上的排序箭头对网格进行排序时,我的

  • 客户表中的余额分为:储值余额和盈利余额 要求下单时订单金额优先从储值余额中扣除,其次盈利余额扣除 扣除储值余额,如返回的balance小于0为待扣除金额,说明还需要扣除盈利余额: <update id="deductBalance" parameterType="com.pay.business.domain.CustomDO" > <!-- BEFORE:更新语句执行前执行selectKe

  • 我正在尝试使用Firebase存储和同步几个CSV文件。这些CSV文件的副本存储在内部存储器中。 为了在本地更新它们,我在Firebase存储桶中循环所有项目,比较两者之间的更新时间,然后如果有新版本,下载它。 除了从Firebase中提取元数据外,所有的东西似乎都运行得很好。Firebase文件的最新更新时间总是返回零?我觉得这很奇怪,因为它可以很好地下载文件,这意味着不应该有一个Firebas