MyBatis批量插入(sqlserver BULK INSERT)

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)

这种的是上述四个方式中最快的。

https://docs.microsoft.com/zh-cn/sql/relational-databases/import-export/import-bulk-data-by-using-bulk-insert-or-openrowset-bulk-sql-server?view=sql-server-ver15

继续追加 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值