Insert title here
为了验证
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
|