我有一个需要获取大量数据来执行其任务的 java jpa/hibernate 应用程序。我遇到了 n+1 问题,所以我决定使用 hibernate.default_batch_fetch_size (@batchsize) 属性来降低所需的 sql 往返次数。我尝试了一些值,但几乎所有尝试过的值都导致性能崩溃。
批量大小:0 - sqls 发送:14000 - 持续时间:约 1 分钟
批处理大小:4 - sqls 发送:5000 - 持续时间:超过 10 分钟
批量大小:10 - sqls 发送:2700 - 持续时间:约 5 分钟
批量:100 - sqls 发送:400 - 持续时间:约 1 分钟
这是“正常”行为吗?如果不是,可能是什么错误?
我用 log4jdbc 记录了生成的 sql。我注意到每个批处理语句之间大约存在 100-150 毫秒。如果我稍后运行 sql,则每个语句的运行时间不超过 20 毫秒。因此,这似乎不是与 DB(IN 语句)相关的问题。
Java:1.6.0_31、Hibernate 3.6.7、DB Postgres 9.1.1、JDBC postgresql-9.1-901.jdbc4.jar
提前致谢
更新使事情变得清楚:性能损失是在批量获取期间而不是批量更新/插入