为了验证 Hibernate 批量数据插入的性能,选择合适的 batchsize ,我做了一个 benchmark 的测试。可是测试的结果非常奇怪。 Jdbc.batch_size 的设置对性能基本没有影响。
注意,本文中所有测试时间单位为毫秒。
第一组测试, batch size 比较
为插入 1000 条订单数据,循环中没有做 flush ,每种 batchsize 重复测 10 次。得到结果如下。
这此数据显示不设 batch size 性能反而最好,但是差别极小。这是什么原因?!
jdbc.batchsize | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 平均值 |
100 | 4468 | 4703 | 4468 | 4297 | 4390 | 4266 | 4406 | 4281 | 4328 | 4234 | 4384 |
50 | 4250 | 4328 | 4313 | 4266 | 4281 | 4235 | 4719 | 4343 | 4344 | 4375 | 4345 |
30 | 4484 | 4859 | 4313 | 4047 | 4204 | 4359 | 4422 | 4469 | 4344 | 4266 | 4377 |
10 | 4313 | 4578 | 4281 | 4312 | 4282 | 4657 | 4063 | 4313 | 4312 | 4313 | 4342 |
不设置 | 4219 | 4235 | 4187 | 4235 | 4297 | 4297 | 4343 | 4313 | 4250 | 4312 | 4269 |
第二组测试 , flush size 比较
与第一组一样插入 1000 条订单数据, batch size 为 100 。循环中每一定条数做一次 flush 。得到结果如下。
这组测试结果基本正常。 Flush size 赿大,时间赿少。但时间少的原因很可能是清理缓存的次数少,而非批处理之功。
flush size | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 平均 |
100 | 4813 | 4719 | 4750 | 4984 | 4906 | 4735 | 5094 | 4734 | 5000 | 4906 | 4864 |
50 | 5687 | 5703 | 5422 | 5438 | 5578 | 5516 | 5578 | 5391 | 5547 | 5500 | 5536 |
30 | 6281 | 6266 | 6281 | 5797 | 6172 | 6704 | 6250 | 6453 | 5875 | 6469 | 6255 |
10 | 7953 | 8640 | 8672 | 9047 | 8547 | 8922 | 8640 | 7844 | 8062 | 8625 | 8495 |
第三组测试,继承表插入
前面两组测试,都是单表插入。本组是双表插入:一个基类表,一个子类表,按 Table per Sub Class 进行 O/R Mapping 。 Batch size 为 100 。 Flush size 为 1000, 50, 30, 10 和不做 flush 。
这个结果也是基本正常
flush size | 1 | 2 | 3 | 平均 |
100 | 5891 | 5703 | 5859 | 5818 |
50 | 6672 | 6625 | 6766 | 6688 |
30 | 7797 | 7344 | 7875 | 7672 |
10 | 9328 | 9406 | 9234 | 9323 |
不做flush | 5250 | 5203 | 5172 | 5208 |