gpt4 book ai didi

java - .persist() 在新线程的 Spring Roo 中不起作用

转载 作者:行者123 更新时间:2023-11-29 03:43:53 25 4
gpt4 key购买 nike

我有一个带有标准域对象的标准 Spring Roo (1.2.0.RC1) 项目。在我的主线程(域 Controller )中,我可以使用查找器创建由数据库支持的域对象实例(我正在使用 Hibernate/MySQL),更改一些属性并通过调用 .persist() 将更改持久保存回数据库在要保存的实例上。

如果我将整个逻辑移动到一个 Runnable 并在一个新线程中执行它(由 ScheduledThreadPoolExecutor.scheduleAtFixedRate() 调用),我仍然可以使用查找器正确地创建域对象的实例,但更改一些属性并调用要保存的对象上的 .persist() 对数据库没有影响。我在控制台日志中没有看到任何内容(在 STS 内部运行)。我不知道是否有 Roo 创建的任何其他日志文件可以为我提供有关可能发生的事情的更多线索。还有其他人遇到过上述问题吗?有谁知道如何在 Roo 的 STS 控制台中获取更详细的日志记录(例如 Hibernate 查询日志记录)?

最佳答案

它与交易有关。 Hibernate 或 JTA 中的默认设置是使用绑定(bind)到线程的本地事务。真的,您不应该尝试跨线程共享事务。无论您在线程之间共享什么对象( hibernate session ?)我敢打赌它们实际上不是线程安全的。

我会尽量简化您的代码,而不是在多个线程中处理更新。如果您必须使用多个线程,则每个线程都必须有自己的事务。

很有可能,您只需要为每个线程创建一个新事务。但这就是为什么你可以从你的线程中选择数据,但你不能持久化。听起来您的线程中的事务没有关闭。

关于java - .persist() 在新线程的 Spring Roo 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9336432/

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