大数据量csv数据的批量导入

1、使用 JdbcTemplate 的batchUpdate 方法实现批量插入

@Transactional
	fun saveAll(us: List<FastoneUsage>) {
		measureTimeMillis {
			batchInsert(us)
		}.also {
			logger.info("saved fastone usages: ${us.size} took $it ms.")
		}
	}


	private fun batchInsert(usages: List<FastoneUsage>) {
		val sql =
			"insert into fastone_usage (vendor_id,record_id,billing_cycle,resource_id,billing_item,start_time,end_time,duration,size,vendor_type,resource_type,lifecycle,vendor,fastone_region,platform) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
		jdbcTemplate.batchUpdate(sql, usages, usages.size) { ps,
		                                                     (vendorId,
			                                                     recordId,
			                                                     billingCycle,
			                                                     resourceId,
			                                                     billingItem,
			                                                     startTime,
			                                                     endTime,
			                                                     duration,
			                                                     size,
			                                                     vendorType,
			                                                     resourceType,
			                                                     lifecycle,
			                                                     vendor,
			                                                     fastoneRegion,
			                                                     platform
		                                                     ) ->
			ps.setString(1, vendorId)
			ps.setString(2, recordId)
			ps.setString(3, billingCycle.toString())
			ps.setString(4, resourceId)
			ps.setString(5, billingItem.name)
			ps.setTimestamp(6, Timestamp.valueOf(startTime))
			ps.setTimestamp(7, Timestamp.valueOf(endTime))
			ps.setLong(8, duration)
			ps.setBigDecimal(9, size)
			ps.setString(10, vendorType)
			ps.setString(11, resourceType)
			ps.setString(12, lifecycle.name)
			ps.setString(13, vendor)
			ps.setString(14, fastoneRegion)
			ps.setString(15, platform.name)
		}
	}


注意:可以做到1秒5000条左右,读取csv部分使用easyexecl 。但是这种可读性不是很好

2、 使用 NamedParameterJdbcTemplate 和MapSqlParameterSource 让批量插入的可读性更好一些

@Service
@Transactional(readOnly = true)
class TencentUsageService(
	private val repository: TencentUsageRepository,
	private val jdbcTemplate: NamedParameterJdbcTemplate,
) : Loggable {

	@Transactional
	fun saveAll(us: List<TencentUsage>) {
		batchInsert(us)
	}

	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("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,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,: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)",
			sources.toTypedArray())
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MySQL 有多种方法可以用来导入大数据。这里列举几种常见的方法: 1. 导入数据库备份文件:如果你已经有了数据库的备份文件,可以使用 MySQL 的 `mysql` 命令行工具来导入。例如: ``` mysql -u username -p db_name < backup-file.sql ``` 2. 使用 `LOAD DATA INFILE` 语句:这个语句可以快速地将数据从文本文件导入到 MySQL 表中。例如: ``` LOAD DATA INFILE '/path/to/data.csv' INTO TABLE tbl_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' ``` 3. 使用 `mysqlimport` 工具:这是 MySQL 安装时自带的一个命令行工具,可以用来快速导入 CSV 文件。例如: ``` mysqlimport --ignore-lines=1 --fields-terminated-by=, --local -u username -p db_name /path/to/data.csv ``` 4. 使用 MySQL 工具:如 MySQL Workbench 等工具可以方便地导入数据。这些工具通常都有图形界面,使用起来非常方便。 5. 使用编程语言:你也可以使用编程语言,如 PHP 或 Python 等,来连接 MySQL 数据库,然后执行 SQL 语句来导入数据。 ### 回答2: 在导入大数据到MySQL数据库时,可以采取以下几种方法: 1. 使用LOAD DATA命令:该命令可以直接从文件中批量导入数据到MySQL。将大数据数据保存为文本文件(如CSV或TXT),然后使用LOAD DATA命令将数据加载到MySQL中。这种方法适用于数据较大,且文件格式规范的情况。 2. 使用MySQL提供的导入工具:MySQL提供了一些专门用于导入数据的工具,如mysqldump、mysqlimport等。通过使用这些工具,可以将大数据数据导入到MySQL中。这些工具可以根据需求选择不同的导入方式,如单个表导入、整个数据导入等。 3. 数据拆分导入:如果一次性导入大数据会导致性能问题,可以考虑将数据进行拆分,分批导入到MySQL中。这可以通过对数据进行分区、分片、分页等方式进行实现。例如,可以将数据按照时间范围、地理位置等因素进行拆分,然后逐个批次导入。 4. 使用并行导入:在导入大数据时,可以尝试使用并行导入的方式。通过同时使用多个数据库连接,将数据进行分割并同时导入,可以提高导入的效率。使用并行导入需要注意保持数据的一致性,并合理设置导入的并发数。 在进行大数据导入时,还需注意数据库的配置参数,如innodb_buffer_pool_size、innodb_log_file_size等,合理调整这些参数可以提高导入的效率。同时,监控导入过程中的系统资源使用情况,及时调整相关参数。 ### 回答3: MySQL是一种常用的关系数据库管理系统,用于存储和管理大数据。当面临大数据导入的情况时,我们可以采取以下几种方法来提高导入的效率。 第一,使用LOAD DATA INFILE命令。这个命令允许我们从文本文件中导入数据到MySQL数据库中。与使用INSERT语句逐条插入数据相比,使用LOAD DATA INFILE可以大大提高导入速度。我们可以通过制定数据文件的路径,以及指定数据文件的格式和字段分隔符等信息,来导入数据。 第二,使用批量插入语句。在插入大数据时,使用批量插入语句可以减少与数据库之间的通信次数,从而提高导入速度。通过将多条INSERT语句合并成一条,并使用VALUES子句一次性插入多个值,可以有效地将数据批量导入到MySQL数据库中。 第三,优化数据库配置。在导入大数据之前,我们可以通过调整MySQL的配置参数来提高导入速度。例如,可以增加Innodb_buffer_pool_size参数的值,以提高数据的读取和写入性能。还可以适当调整其他与磁盘读写相关的配置参数,以优化导入过程的性能。 第四,使用并行导入工具。有些第三方工具可以帮助我们在导入数据时实现并行处理,从而提高导入速度。例如,可以使用MySQL的并行复制功能来同时导入多个数据文件,或使用并行导入工具如mydumper等来加速导入过程。 总之,导入大数据到MySQL数据库可以采取多种方法来提高导入效率。通过选择合适的导入命令、优化数据库配置、使用批量插入语句以及利用并行导入工具等,我们能够更加高效地将数据导入到MySQL中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值