gpt4 book ai didi

java - 你可以在一个 Hibernate Session 中有多个事务吗?

转载 作者:IT老高 更新时间:2023-10-28 20:27:10 30 4
gpt4 key购买 nike

你可以在一个 Hibernate Session 中有多个事务吗?

我不清楚这是否是可取的。在我的代码中,我有一个长时间运行的线程并从阻塞队列中获取项目,这取决于队列中的内容,它可能需要创建和保存一个 hibernate 对象,或者它可能不需要做任何事情。

每个项目都是不同的,所以如果项目 1 被保存并且项目 2 未能保存任何我不想阻止项目 1 被添加到数据库的原因。

所以最简单的方法是为每个需要创建的项目创建一个新 session 、打开事务、保存新对象、提交事务、关闭 session

但是,这意味着为每个项目创建一个新 session ,这似乎违背了 Hibernates 自己的建议,即不执行 Session Per Request Pattern。所以我的替代方法是在线程中创建一个 session ,然后在需要创建新对象时根据需要打开并提交一个新事务。但我没有看到这种方法的例子,我不确定它是否真的有效。

最佳答案

如果您运行本地事务,则每个请求的 session 模式每个 session 使用一个 JDBC 连接。对于 JTA,连接会在每条语句后积极释放,只为下一条语句重新获取。

Hibernate 事务 API 将 begin/commit/rollback 委托(delegate)给本地事务的 JDBC 连接和 JTA 的关联 UserTransaction。因此,您可以在同一个 Hibernate Session 上运行多个事务,但有一个问题。一旦抛出异常,您就不能再重用该 Session。

我的建议是分而治之。只需拆分所有项目,为每个项目构建一个 Command 对象并将它们发送到 ExecutorService#invokeAll .使用返回的 List 迭代并调用 Future#get()确保原始线程在所有批处理作业完成后等待。

ExecutorService 将确保您同时运行所有命令,并且每个命令都应使用使用自己的 @Transaction 的服务。因为事务是线程绑定(bind)的,所以您将拥有所有 batch jobs run in isolation .

关于java - 你可以在一个 Hibernate Session 中有多个事务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25893476/

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