為了驗證 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 |