1、注入必要的jebdTemple

private val jdbcTemplate: NamedParameterJdbcTemplate

2、编写批量插入的方法

private fun batchInsert(usages: List<TencentUsage>) {
val sources = usages.map {
MapSqlParameterSource()
.addValue("billing_cycle", it.billingCycle.toString())
.addValue("record_id", it.recordId)
.addValue("resource_id", it.resourceId)
.addValue("resource_name", it.resourceName)
.addValue("product_name", it.productName)
.addValue("sub_product_name", it.subProductName)
.addValue("component_type", it.componentType)
.addValue("component_name", it.componentName)
.addValue("transaction_type", it.transactionType)
.addValue("vendor_id", it.vendorId)
.addValue("sub_vendor_id", it.subVendorId)
.addValue("start_time", it.startTime)
.addValue("end_time", it.endTime)
.addValue("duration", it.duration)
.addValue("duration_unit", it.durationUnit)
.addValue("size", it.size)
.addValue("size_unit", it.sizeUnit)
.addValue("amount", it.amount)
}
jdbcTemplate.batchUpdate(
""" insert into tencent_usage (
billing_cycle,record_id,resource_id,resource_name,product_name,
sub_product_name,component_type,component_name,transaction_type,vendor_id,sub_vendor_id,start_time,
end_time,duration,duration_unit,size,size_unit,amount)
values(
:billing_cycle,:record_id,:resource_id,:resource_name,:product_name,
:sub_product_name,:component_type,:component_name,:transaction_type,:vendor_id,:sub_vendor_id,:start_time,
:end_time,:duration,:duration_unit,:size,:size_unit,:amount)
ON conflict(record_id) DO NOTHING;
""",
sources.toTypedArray()
)
}

3、调用批量插入的方法

fun saveAll(tencentUsages: List<TencentUsage>, billingCycle: YearMonth) {
if (tencentUsages.isNotEmpty()) {
logger.info("tencentUsage save db,size=${tencentUsages.size}")
batchInsert(tencentUsages)

}
}

4、验证结果

可以做到1秒5000条左右