【发布时间】: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