MyBatis批量插入(sqlserver BULK INSERT)

编程入门 行业动态 更新时间:2024-10-26 14:30:34

MyBatis<a href=https://www.elefans.com/category/jswz/34/1770428.html style=批量插入(sqlserver BULK INSERT)"/>

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)

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

=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の制限関連:
.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件数制限関連:
=sql-server-ver15
③、Sqlserverパラメータ数制限関連:
=sql-server-ver15

更多推荐

MyBatis批量插入(sqlserver BULK INSERT)

本文发布于:2023-06-14 20:08:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/712564.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:批量   MyBatis   sqlserver   INSERT   BULK

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!