.persist()在一个新线程中不能在Spring Roo中工作

时间:2012-02-17 22:37:01

标签: java mysql multithreading hibernate spring

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

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

1 个答案:

答案 0 :(得分:0)

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

我会尝试简化您的代码,而不是在多个线程中处理更新。如果你必须使用多个线程,他们每个人都必须拥有自己的交易。

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