【问题标题】:How to be sure entity is persisted before calling another thread which queries this persisted entity?在调用另一个查询该持久化实体的线程之前,如何确保实体被持久化?
【发布时间】:2013-08-13 03:17:14
【问题描述】:

我的 Java Web 应用程序(Spring + JPA)出现以下情况:

  1. 我有将实体持久保存到数据库的方法
  2. 在持久实体之后,我立即调用 notify(),它正在唤醒另一个线程。
  3. 第二个线程正在处理我刚刚持久化的实体。

因此,我有: 第二个线程查询一个新的持久实体,但它还不存在。所以第二个线程更快地将查询发送到数据库,然后主线程将其持久化。如果我添加一些超时,它会完美运行。但这对我来说不是一个合适的解决方案。我想我可以使用contains() 方法检查 entitymanager。但我不确定它的效率如何。 我对这个主题很陌生,所以我很高兴听到你的建议。

附言我正在使用 Spring 框架,因此在一个事务中持久化并通知发生(标有 @Transactional 注释)。第二个线程没有任何@Transactional 类。

谢谢, 艾米丽。

【问题讨论】:

    标签: java multithreading persistence entitymanager spring-transactions


    【解决方案1】:

    尝试使用Entity Listeners 在实体持久化时收到通知。您可以在JPA Wiki BookHibernate documentationwww.objectdb.com 中阅读有关实体侦听器的信息。

    【讨论】:

    • 谢谢你,卡托纳。这个解决方案对我不起作用,但让我知道如何最终解决我的问题。实体监听器不起作用,因为它是在一个事务中调用的,我仍然遇到同样的问题。所以我使用了TransactionSynchronizationManager,下面我将对其进行描述。
    【解决方案2】:

    真正持久化到数据库仅在事务提交后发生,目前它发生在@Transactional 方法中。所以我需要在事务提交后调用第二个线程,并且我能够使用 TransactionSynchronizationManager 及其 afterCommit() 方法来完成它。这是包含所有信息和示例的链接http://azagorneanu.blogspot.ru/2013/06/transaction-synchronization-callbacks.html 也许它会对某人有用。

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 2014-02-10
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      相关资源
      最近更新 更多