【发布时间】:2021-09-09 17:26:55
【问题描述】:
我有一个大约 20 000 个实体的列表,这些实体是循环的,并使用这样的 persists 方法添加到 EntityManager:¨
public final void createE(e entity) {
em.persist(entity);
}
那么这里有什么问题呢?为什么连接会关闭? Hibernate 不应该处理这个问题并在需要时建立一个新的连接吗?
【问题讨论】:
-
什么是处理事务范围? Persist 本身是一个将对象注册到 EntityManager 上下文中的无操作,但在事务提交之前它不会插入 - 正是该事务对您超时。您必须管理大小和连接属性,以便事务可以在您的驱动程序/系统配置为允许其保持打开状态的时间内完成。
-
嗯好的,但是当我去远程数据库而不是本地时,为什么这个循环需要 1 小时?实体管理器是否自己决定何时将其实际写入数据库?
-
不,它没有,事务范围有。可能不是需要花费一小时的循环,而是事务提交时的事务调用(提交/刷新)应该会导致您使用已配置的 JDBC/数据源将持久化的所有内容写入数据库。您将需要查看从数据库到应用程序的所有设置,以针对此用例对其进行调整,并可能将您的事务分解为更小的块(如果您在 20k 单独的事务中这样做,则可能更大)以便它们能够成功在合理的时间内,甚至异步运行。