【问题标题】:Is it possible to know the progress of a transaction.commit operation?是否可以知道 transaction.commit 操作的进度?
【发布时间】:2022-01-11 01:24:06
【问题描述】:

我在我的应用程序中使用 JPA 将一系列插入和更新捆绑到一个 commit() 操作中。

当提交运行时,是否可以了解该操作的进度 (0-100%),以便我可以在进度条中向用户显示?

我可以将我的更新分成多个提交,但这会使整个工作花费更长的时间。

使用 EclipseLink 作为我的 JPA 提供者。

【问题讨论】:

  • 您使用的是哪个 Jpa 实现?休眠?
  • 请发布您的简化代码。 commit 通常是一个非常快速的操作,即使对于大型事务也是如此,并且不需要显示进度
  • @Marmite 这是一个包含几千条记录的文件导入,最终每条记录运行多个插入和更新。
  • EclipseLink 还具有您可能使用的性能监控工具(请参阅eclipse.org/eclipselink/documentation/2.5/concepts/…)。不幸的是,我认为这两个选项都不是您想要的——它们似乎都旨在跟踪统计数据,并且似乎没有衡量交易中剩下的内容。为此,您需要连接到 EclipseLink 的会话侦听器 eclipse.org/eclipselink/documentation/2.4/jpa/extensions/… 。这可能允许获取它正在使用的变更集,并帮助跟踪需要完成的工作量。

标签: java jpa jdbc eclipselink


【解决方案1】:

我认为创建类似内容的唯一方法是使用hibernateorg.hibernate.stat.internal.StatisticsImpl 类。您可以通过编程方式从此类的实例化中获取不同的指标。必须启用休眠统计信息生成才能使其正常工作。您可以通过将属性hibernate.generate_statistics 设置为true 来启用它。

统计实例有一个名为getQueryExecutionCount() 的方法,您可以使用它来构建进度条。它给出了当前 JPA EntityManagerFactory 或 Hibernate 执行的查询数。如果您在查询仍在运行时继续在while 循环中调用该方法,您可以通过将getQueryExecutionCount() 的返回值除以需要处理的查询总数来显示已完成查询的百分比。 Heres a good tutorial 解释了所有可用的不同指标。

我还必须指出,打开休眠统计信息可能会减慢您的应用程序速度。因此,如果您想在生产中使用此功能,则还必须测试这种减速是否可以接受。

编辑:您还可以选择仅在查询运行之前打开休眠统计信息,并在查询完成后将其关闭。

StatisticsImpl 类有一个名为 setStatisticsEnabled(boolean b) 的方法,您可以使用该方法以编程方式打开或关闭它。

编辑 2:我在这里假设您使用 Hibernate 作为 JPA 提供程序。如果不是,我会删除这个答案。

【讨论】:

  • 我正在使用 eclipselink。我应该提到这一点。
  • @Holden 我不熟悉 eclipselink
猜你喜欢
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2017-09-04
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多