赞
踩
MyBatis批量插入:
1. foreach方式
2.sqlsession + sqlsession.flushStatements方式:
// SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
//
// logger.debug("mybatis sql batchinsert start");
// long start = System.currentTimeMillis();
// for (int i = 0; i < user.length; i++) {
// User entity = user[i];
// userDao.insert(entity);
// if (i % 5000 == 4999) {
// sqlSession.flushStatements();
// }
// }
// sqlSession.flushStatements();
// logger.debug("mybatis sql batchinsert end" + (System.currentTimeMillis() - start));
3.JDBC的executeBatch利用
如果是Mybatis+MySQL 一般推荐利用方式2,但是需要给mySQL连接时追加参数rewriteBatchedStatements=true
具体性能对比可以参考MyBatis批量插入几千条数据慎用foreach_淡然坊-CSDN博客_mybatis批量更新几千条数据
但是如果是Mybatis+sqlserver的话 上述的就不管用了。反而batch更加慢了
因为做foreach的时候因为sqlserver 要求每次最大参数为2100个,因此需要做分批提交 这样每次提交的条数反而在100件以内了。
上述3个方式在1万和10万的数据量下 foreach反而是最快的。
sqlserver针对大数据量的批量插入提供了BULK INSERT的解决案:
BULK INSERT voucher_status_test FROM '/tmp/test.csv'
with (fieldterminator=',', rowterminator='\n',FIRE_TRIGGERS)
这种的是上述四个方式中最快的。
继续追加 SQLServerBulkCopy的方式:(不用再两个服务器间进行数据文件的传递)
Connection con = DataSourceUtils.getConnection(dataSourceTransactionManager.getDataSource());
con.setAutoCommit(false);
if (con.isWrapperFor(SQLServerConnection.class)) {
try {
logger.debug("APサーバに出力CSV ファイル開始");
writeToFile(ap_output_path + csvNm, csv_data);
logger.debug("APサーバに出力CSV ファイル終了");
logger.debug("「bulk Copy」実行開始");
SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(con.unwrap(SQLServerConnection.class));
SQLServerBulkCSVFileRecord fileRecord = new SQLServerBulkCSVFileRecord(ap_output_path + csvNm, "UTF-8",
new String(new char[] { ',' }), true);
// Set the metadata for each column to be copied.
fileRecord.addColumnMetadata(1, "column1", java.sql.Types.NVARCHAR, 20, 0);
fileRecord.addColumnMetadata(2, "column2", java.sql.Types.NCHAR, 4, 0);
fileRecord.addColumnMetadata(3, "column3", java.sql.Types.INTEGER, 0, 0);
SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
copyOptions.setFireTriggers(true); // 启动表中的触发器
bulkCopy.setBulkCopyOptions(copyOptions);
bulkCopy.setDestinationTableName("表名");
bulkCopy.writeToServer(fileRecord);
logger.debug("「bulk Copy」実行終了");
logger.debug("APサーバとDBサーバにCSV ファイル削除開始");
deleteCsvFile(ap_output_path + csvNm);
logger.debug("APサーバとDBサーバにCSV ファイル削除終了");
} catch (IOException e) {
throw new IORuntimeException(e);
}
官网地址:
通过 JDBC 驱动程序使用大容量复制 - JDBC Driver for SQL Server | Microsoft Docs
其他:
①、Mysqlの制限関連: |
https://dev.mysql.com/doc/refman/8.0/ja/column-count-limit.html#:~:text=%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%8C%E3%82%88%E3%82%8A%E5%A4%A7%E3%81%8D%E3%81%AA%E8%A1%8C%E3%82%92%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E3%81%8D%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%A7%E3%82%82%E3%80%81MySQL%20%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E5%86%85%E9%83%A8%E8%A1%A8%E7%8F%BE%E3%81%AE%E6%9C%80%E5%A4%A7%E8%A1%8C%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AF%2065%2C535%20%E3%83%90%E3%82%A4%E3%83%88%E3%81%A7%E3%81%99%E3%80%82%20BLOB%20%E3%81%8A%E3%82%88%E3%81%B3,TEXT%20%E3%81%AE%E3%82%AB%E3%83%A9%E3%83%A0%E3%81%AF%E3%80%81%E8%A1%8C%E3%82%B5%E3%82%A4%E3%82%BA%E5%88%B6%E9%99%90%E3%81%AB%209%20%E3%81%8B%E3%82%89%2012%20%E3%83%90%E3%82%A4%E3%83%88%E3%81%AE%E3%81%BF%E5%AF%84%E4%B8%8E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82 |
②、Sqlserver件数制限関連: |
https://docs.microsoft.com/en-us/sql/t-sql/queries/table-value-constructor-transact-sql?view=sql-server-ver15 |
③、Sqlserverパラメータ数制限関連: |
https://docs.microsoft.com/ja-jp/sql/sql-server/maximum-capacity-specifications-for-sql-server?view=sql-server-ver15 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。