【问题标题】:JPA/Hibernate improve batch insert performanceJPA/Hibernate 提高批量插入性能
【发布时间】:2013-07-23 18:02:54
【问题描述】:

我有一个数据模型,它在一个实体和 11 个其他实体之间具有一对多关系。这 12 个实体共同代表一个数据包。我遇到的问题与这些关系的“多”侧发生的插入数量有关。其中一些可以有多达 100 个单独的值,因此要将一个完整的数据包保存在数据库中,它需要多达 500 次插入。

我正在使用带有 InnoDB 表的 MySQL 5.5。现在,通过对数据库的测试,我发现它在处理批量插入时每秒可以轻松地进行 15000 次插入(使用 LOAD DATA 时甚至更多,但这对于这种情况是不切实际的)。

是否有某种方法可以使用 Hibernate 将这些单独的 500 个插入组合成,例如 - 5 个具有 100 个值的插入(对于每个具有 100 个值的 5 个链接实体)?

根据要求:

@OneToMany(mappedBy="beat", cascade=CascadeType.ALL)
@OrderBy("miliseconds ASC")
public List<AmbientLight> lights;

我可能还应该提到一个重要信息 - 我正在使用 Play!框架 1.2.3

【问题讨论】:

  • 您可以发布您的 ONE TO MANY 注释或 hbm.xml 吗?
  • 我已经更新了原帖。问题很可能是这样一个事实,即它为每个 LIGHT 对象创建了一个 INSERT 语句(对于 6 个其他对象也是如此),因此它最终在一个事务中执行了大约 500 次插入。
  • 我认为应该没有性能问题,除非你在这么多线程中这样做。也许您可以尝试设置批量大小参数?或者使用.createNativeQuery() 代替,如果您认为 sql 更快且值得。
  • 是的,我知道本机查询可能会更快,但我不期待为以这种方式链接的 11 个实体编写本机查询!此外,对同一个表执行 500 次插入总是比插入 500 个值慢。 (插入 .... 值 (), (), (), ....)
  • 批量大小参数怎么样?至少您可以节省一些往返数据库的时间。你能发布你的代码来插入那个实体吗?

标签: hibernate jpa playframework bulkinsert playframework-1.x


【解决方案1】:

我已经设法通过对每个“组”插入使用 Hibernate 会话来解决这个问题。结果是保存数据所需的时间减少了大约 7 倍。过去大约需要 2000 毫秒来保存一个“数据包”,而现在需要 200 毫秒到 300 毫秒来做同样的事情。

重复一遍 - 这对 Play 有效!框架 1.2.3 - 我不确定这是否或如何适用于其他使用 Hibernate 的框架或应用程序。

    Session mySession = (Session) Pressure.em().getDelegate();

    for(int i = 0 ; i < data.size() ; i++){
        initializeFromJsonAndSave(data.get(i), mySession);
    }
    s.flush();
    s.clear();

'initializeFromJsonAndSave' 方法已更改,因此调用 mySession.save(myNewObject) 而不是调用对象的 save() 方法。

【讨论】:

  • 这限制了由于休眠脏检查导致的开销,但在后台你不使用 jdbc 批处理 api 所以这不如原始 jdbc 快,检查你的 sql 日志看看会发生什么
  • 您有什么建议可以在不偏离典型 Play 太远的情况下进一步改进它!框架约束?
  • 如果性能对您来说还可以,您可以继续使用此解决方案。您可以进行的另一项改进是将您的提交分成多个事务,而不是刷新和清除休眠会话。玩游戏的一种简单方法是使用工作。您的作业以 100 个对象为例迭代它们并提交。如果顺序无关紧要,您可以在控制器中并行启动多个作业并等待所有作业在您的控制器中终止
【解决方案2】:

这里有两个很好的答案

请注意,使用身份生成器(它是默认情况下用于播放的生成器)批量插入被禁用。

【讨论】:

  • 我不认为 Play Framework 默认使用身份,是吗?
  • 是的,请参阅 play.db.jpa.Model 类
猜你喜欢
  • 2019-12-07
  • 2021-10-02
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多