gpt4 book ai didi

java - 如何强制*立即*将新记录保存到数据库中?

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:48 29 4
gpt4 key购买 nike

我正在开发一个具有两个线程的 Java/Seam/Hibernate/Glassfish 应用程序:

  • 线程 #1 发送各种消息并将摘要信息写入 MySQL 数据库。
  • 线程 #2 定期轮询数据库(由 ScheduledExecutorService 调用)并对每条消息的当前“状态”进行操作。

遇到集成测试问题:线程 #2 等待线程 #1 添加新行的时间似乎并不重要,只是在测试期间未添加新行,因此未进行预期的调用。果然,在测试失败后,会弹出一个新行 - 但为时已晚。不确定这是否可能是一个设计问题 - Thread #2 当前使用 Lifecycle.beginCall()...Lifecycle.endCall() 获取 Seam 上下文。所以我的理解(可能是错误的)可能是问题是由于两个线程有​​两个单独的 Hibernate session - 所以一个读取不知道一个写入的最新信息?

可能有不同的方法来解决这个问题,但我目前的想法是,当我调用 save()/flush() 甚至手动提交事务时,我不能强制 Hibernate 实际上立即将记录添加到表中吗?这些都没有运气 - 让我想知道是否有某种托管事务正在幕后使用。感谢您的任何建议...

有关信息,以下是添加记录的代码要点:

// Obtain Hibernate session
Session session = (Session) Component.getInstance("hibernateSession");

// Create request
Request newRequest = new Request();
// newRequest.set<blah>();

// Save the new request to the database
session.save(newRequest);

// Have tried session.flush(), transaction.commit() etc. here.
// Nothing seems to put the record into the database straight away.

不确定这是否相关,但这是 Hibernate 配置:

<property name="transaction.flush_before_completion">true</property>
<property name="connection.release_mode">after_statement</property>
<property name="transaction.manager_lookup_class">org.hibernate.transaction.SunONETransactionManagerLookup</property>
<property name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
<property name="current_session_context_class">jta</property>

(由于这是客户拥有的现有应用程序,我无权更改 Hibernate 配置。)

最佳答案

你的猜测不错。

您正在使用JTATransactionFactory,因此事务由JTA(即容器)划分。

用于保存 Request 的方法(这里我假设它是在 EJB 中定义的)需要使用事务注释进行注释:@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW),因此当该方法结束时,事务将被提交。

关于java - 如何强制*立即*将新记录保存到数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14853837/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com