Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.
千万级入库方法选择
一次性导入千万级数据库到Mysql
批处理框架Springbatch的选择
JDBC的方式插入
@Slf4j
@RestController
public class TestController {
@Autowired
DataJob dataJob;
@Autowired
private JobLauncher jobLauncher;
@RequestMapping("/data")
public String data() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
// 根据时间配置每个job完成的使用参数,因为时间不一样所以参数不一样,所以任务可以重复执行
JobParameters jobParameters = new JobParametersBuilder()
.addDate("date", new Date())
.addString("data", "data") // 传入参数 可以带入到job中
.toJobParameters();
JobExecution run = jobLauncher.run(dataJob.DataJob(), jobParameters);
log.info("job执行结果:{}", JSONObject.toJSONString(run));
BatchStatus status = run.getStatus();
return JSONObject.toJSONString(status);
}
}
十万条数据测试性能:
通过这种方式插入,明显能够提高数据插入的效率。与普通插入方法对比:虽然第一种方法通过优化后,同样的可以减少数据库连接次数,但这种方法,不仅是减少数据库连接,更重要的是:合并后日志量(MySQL的binlog和innodb的事务让日志)减少了,降低日志刷盘的数据量和频率,从而提高效率。同时也能减少SQL语句解析的次数,减少网络传输的IO,所以性能有极大的提升。
2.3、MySqlBulkLoader插入方式
下面我们采用MySQLBulkLoader方法测试插入,MySQLBulkLoader也称为LOAD DATA INFILE,它的原理是从文件读取数据。所以我们需要将我们的数据集保存到文件,然后再从文件里面读取导入。
//开始时间
var startTime = DateTime.Now;
using (var conn = new MySqlConnection(connsql))
{
conn.Open();
var table = new DataTable();
table.Columns.Add("id", typeof(string));
table.Columns.Add("trade_no", typeof(string));
//生成10万数据
for (var i = 0; i < 100000; i++)
{
if (i % 500000 == 0)
{
table.Rows.Clear();
}
//记录
var row = table.NewRow();
row[0] = Guid.NewGuid().ToString();
row[1] = "trade_" + (i + 1);
table.Rows.Add(row);
//50万条一批次插入
if (i % 500000 != 499999 && i < (100000 - 1))
{
continue;
}
Console.WriteLine("开始插入:" + i);
//数据转换为csv格式
var tradeCsv = DataTableToCsv(table);
var tradeFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "trade.csv";
File.WriteAllText(tradeFilePath, tradeCsv);
#region 保存至数据库
var bulkCopy = new MySqlBulkLoader(conn)
{
FieldTerminator = ",",
FieldQuotationCharacter = '"',
EscapeCharacter = '"',
LineTerminator = "\r\n",
FileName = tradeFilePath,
NumberOfLinesToSkip = 0,
TableName = "trade"
};
bulkCopy.Columns.AddRange(table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList());
bulkCopy.Load();
#endregion
}
conn.Close();
}
//完成时间
var endTime = DateTime.Now;
//耗时
var spanTime = endTime - startTime;
Console.WriteLine("MySqlBulk方式耗时:" + spanTime.Minutes + "分" + spanTime.Seconds + "秒" + spanTime.Milliseconds + "毫秒");
参考资料
官方文档
开源社区
博客文章
书籍推荐
1.https://blog.csdn.net/m0_67402774/article/details/126790443
2.https://blog.csdn.net/weixin_43288999/article/details/128472343
3.https://blog.csdn.net/daremeself/article/details/117039045
欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!同时,期望各位大佬的批评指正~