【问题标题】:Why are the insert batch times increasing?为什么插入批处理时间会增加?
【发布时间】:2015-09-18 01:33:15
【问题描述】:

总结: 一次插入 100k 行,有 1k 个批次(是的,它肯定是成批的),并且每个批次的插入时间都在增加。试图了解原因。

原问题: JProfiler 显示了在 ReadAheadInputStream.fill 中读取 InputStream 所花费的大量时间。

更新:以下来自 EJP 的评论“时间被阻塞在 read() 中,而数据库服务器正在执行语句并准备响应”

是什么原因导致在这里花费这么多时间?

详情:

  • 以 1k 批次将行插入到单个表中。
  • 批次位于触发 Hibernate 会话刷新的事务中。
  • Hibernate 和 MySQL 连接批处理属性已启用,并且分析确认 SQL INSERT 确实按预期批处理。
  • 随着表的增长,插入的时间也会增长(即,第一个 100k 在 25 秒内插入,第二个 100k 在 30、35、40 等内插入)。

我们有另一个应用程序(使用 JDBC 模板)在同一个表上执行相同的 INSERT,但不会随着表的增长而减慢速度。因此,虽然 db 调优可能会提高性能,但由于另一个应用程序基本上执行相同的插入操作而没有性能问题,次优的 DB 配置并不能解释速度变慢。

开发栈:
- Java 8
- 休眠 4.3.6
- Spring Data JPA 1.7.2
- MySQL 5.6.20
- MySQL 驱动程序 5.1.33
- HikariCP 2.3.2

我知道我没有提供代码示例。我基本上是在寻找想法并更好地理解可能导致在 ReadAheadInputStream.fill 和调用堆栈下面花费这么多时间的原因。

【问题讨论】:

  • 你的数据没有显示出来。它表明几乎没有时间花在checkErrorPacket() 上。时间被阻塞在 read() 中。显然checkErrorPacket() 处于读取响应的正常流程中,而不是仅仅在响应中有 错误数据包时被调用。
  • @EJP,这是一个很好的观点。谢谢。我会更新问题
  • 这是一个类似的问题,但在我们的例子中,我们只有 1 个打开的数据库连接。 stackoverflow.com/questions/25356260/…
  • 嗯,答案还是一样的。时间被阻塞在read(),而数据库服务器正在执行语句并准备响应。如果您想知道为什么 this 需要这么长的时间,这就是您应该问的问题。执行时间的百分比确实与它无关。

标签: mysql hibernate spring-data-jpa mysql-connector hikaricp


【解决方案1】:

最后,我们无法确定根本原因并修复使用 JPA/Hibernate 进行批量插入的降级问题。因此,对于大批量插入,我们已恢复为使用 JDBC 模板。我们不再看到任何性能下降。

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 2016-06-07
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2015-01-08
    • 2023-03-22
    相关资源
    最近更新 更多