为什么插入批次会增加?

时间:2015-07-01 03:30:18

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

要点: 使用1k批次一次插入100k行(是的,它肯定是批处理的),并且每个批次的插入时间都在增加。试图了解原因。

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

更新:以下来自EJP的评论“数据库服务器正在执行语句并准备响应”

什么可能导致这么多时间在这里?

详细信息:

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

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

Dev Stack:
  - Java 8
  - Hibernate 4.3.6
  - Spring Data JPA 1.7.2
  - MySQL 5.6.20
  - MySQL驱动程序5.1.33
  - HikariCP 2.3.2

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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