精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MyBatis批量插入數據優化,那叫一個優雅!

開發 前端
我們使用了 mybatis-plus 框架,并采用其中的 saveBatch 方法進行批量數據插入。然而,通過深入研究源碼,我發現這個方法并沒有如我期望的那樣高效。

在項目開發中,我們經常需要進行大量數據的批量插入操作。然而,在實際應用中,插入大量數據時性能常常成為一個瓶頸。在我最近的項目中,我發現了一些能夠顯著提升批量插入性能的方法,并進行了一系列實驗來驗證它們的有效性。

今日內容介紹,大約花費15分鐘

圖片圖片

背景介紹

我們使用了 mybatis-plus 框架,并采用其中的 saveBatch 方法進行批量數據插入。然而,通過深入研究源碼,我發現這個方法并沒有如我期望的那樣高效

圖片圖片

這是因為最終在執行的時候還是通過for循環一條條執行insert,然后再一批的進行flush ,默認批的消息為1000

圖片圖片

為了找到更優秀的解決方案,我展開了一場性能優化的探索之旅。好了我們現在開始探索

實驗準備

  • 創建一張表tb_student
create table springboot_mp.tb_student
(
    id      bigint auto_increment comment '主鍵ID'
        primary key,
    stuid   varchar(40)   not null comment '學號',
    name    varchar(30)   null comment '姓名',
    age     tinyint       null comment '年齡',
    sex     tinyint(1)    null comment '性別 0 男 1 女',
    dept    varchar(2000) null comment '院系',
    address varchar(400)  null comment '家庭地址',
    constraint stuid
        unique (stuid)
);
  • 創建spring-boot-mybatis-demo項目并在pom.xml中添加依賴

圖片圖片

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
    </dependency>


    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3</version>
    </dependency>


    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>
  • application.yml配置
server:
  port: 8890

spring:
  application:
    name: mybatis-demo #指定服務名
  datasource:
    username: root
    password: root
#    url: jdbc:mysql://localhost:3306/springboot_mp?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
    url: jdbc:mysql://localhost:3306/springboot_mp?useUnicode=true&characterEncoding=utf8
    driver-class-name: com.mysql.cj.jdbc.Driver
#
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath*:/mapper/**/*.xml
  • 使用mybatisX生成代碼

圖片圖片

圖片圖片

圖片圖片

探索實驗

每次都是插入100000條數據

注意:因為我的電腦性能比較好,所以才插入這么多數據,大家可以插入1000進行實驗對比

  1. 單條循環插入:傳統方法的基準

首先,我采用了傳統的單條循環插入方法,將每條數據逐一插入數據庫,作為性能對比的基準。

/**
 * @author springboot葵花寶典
 * @description: TODO
 */
@SpringBootTest
public class MybatisTest {

    @Autowired
    private StudentService studentService;

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Test
    public void MybatisBatchSaveOneByOne(){


        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start("mybatis plus save one");
            for (int i = 0; i < 100000; i++) {
                Student student = new Student();
                student.setStuid("6840"+i);
                student.setName("zhangsan"+i);

                student.setAge((i%100));


                if(i%2==0){
                    student.setSex(0);
                }else {
                    student.setSex(1);
                }

                student.setDept("計算機學院");
                student.setAddress("廣東省廣州市番禺"+i+"號");
                //一條一條插入
                studentService.save(student);
            }
            sqlSession.commit();
            stopWatch.stop();
            System.out.println("mybatis plus save one:" + stopWatch.getTotalTimeMillis());

        } finally {
            sqlSession.close();
        }

    }

}

發現花費了195569毫秒

圖片圖片

  1. mybatis-plus 的 saveBatch 方法

現在嘗試 mybatis-plus 提供的 saveBatch 方法,期望它能夠提高性能。

@Test
    public void MybatissaveBatch(){


        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {

            List<Student> students = new ArrayList<>();
            StopWatch stopWatch = new StopWatch();

            stopWatch.start("mybatis plus save batch");
            for (int i = 0; i < 100000; i++) {
                Student student = new Student();
                student.setStuid("6840"+i);
                student.setName("zhangsan"+i);

                student.setAge((i%100));


                if(i%2==0){
                    student.setSex(0);
                }else {
                    student.setSex(1);
                }

                student.setDept("計算機學院");
                student.setAddress("廣東省廣州市番禺"+i+"號");
                //一條一條插入
                students.add(student);
            }

            studentService.saveBatch(students);
            sqlSession.commit();
            stopWatch.stop();
            System.out.println("mybatis plus save batch:" + stopWatch.getTotalTimeMillis());

        } finally {
            sqlSession.close();
        }

    }

發現花費9204毫秒,比一條條插入數據性能提高十幾倍

圖片

3.手動拼接 SQL:挑戰傳統的方式

<insert id="saveBatch2">
    insert into springboot_mp.tb_student ( stuid, name, age, sex, dept, address)
    values
    <foreach collection="students" item="stu" index="index" separator=",">
          ( #{stu.stuid}, #{stu.name}, #{stu.age}, #{stu.sex}, #{stu.dept}, #{stu.address})
    </foreach>

</insert>

發現花費10958毫秒,比一條條插入數據性能提高十幾倍,但是和saveBatch性能相差不大

既然都驗證都這了,我就在想,要不要使用JDBC批量插入進行驗證一下,看會不會出現原始的才是最好的結果

4.JDBC 的 executeBatch 方法

嘗試直接使用 JDBC 提供的 executeBatch 方法,看是否有意外的性能提升。

@Test
    public void JDBCSaveBatch() throws SQLException {


        SqlSession sqlSession = sqlSessionFactory.openSession();
        Connection connection = sqlSession.getConnection();
        connection.setAutoCommit(false);



        String sql ="insert into springboot_mp.tb_student ( stuid, name, age, sex, dept, address) values (?, ?, ?, ?, ?, ?);";
        try (PreparedStatement statement = connection.prepareStatement(sql)) {

            List<Student> students = new ArrayList<>();
            StopWatch stopWatch = new StopWatch();
            stopWatch.start("mybatis plus JDBCSaveBatch");
            for (int i = 0; i < 100000; i++) {
                statement.setString(1,"6840"+i);
                statement.setString(2,"zhangsan"+i);
                statement.setInt(3,(i%100));
                if(i%2==0){
                    statement.setInt(4,0);
                }else {
                    statement.setInt(4,1);
                }
                statement.setString(5,"計算機學院");
                statement.setString(6,"廣東省廣州市番禺"+i+"號");


                statement.addBatch();
            }

            statement.executeBatch();
            connection.commit();
            stopWatch.stop();
            System.out.println("mybatis plus JDBCSaveBatch:" + stopWatch.getTotalTimeMillis());

        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
        finally {

            sqlSession.close();
        }

JDBC executeBatch 的性能會好點,耗費6667毫秒

圖片

但是感覺到這里以后,覺得時候還是比較長,有沒有可以再進行優化的方式,然后我就在ClientPreparedStatement類中發現有一個叫做rewriteBatchedStatements 的屬性,從名字來看是要重寫批操作的 Statement,前面batchHasPlainStatements 已經是 false,取反肯定是 true,所以只要這參數是 true 就會進行一波操作。rewriteBatchedStatements默認是 false。

圖片圖片

圖片

圖片圖片

大家也可以自行網上搜索一下這個神奇的屬性然后我在url添加上這個屬性

圖片圖片

然后繼續跑了下 mybatis-plus 自帶的 saveBatch,果然性能大大提高直接由原來的9204毫秒,提升到現在的3903毫秒

圖片圖片

再來跑一下JDBC 的 executeBatch ,果然也提高了。

直接由原來的6667毫秒,提升到了3794毫秒

圖片

結果對比

批量保存方式

數據量(條)

耗時(ms)

單條循環插入

100000

195569

mybatis-plus saveBatch


100000

9204

mybatis-plus saveBatch(添加 rewrite 參數)

100000

3903

手動拼接 SQL

100000

6667

JDBC executeBatch

100000

10958

JDBC executeBatch(添加 rewrite 參數)

100000

3794

結論

通過實驗結果,我們可以得出以下結論:

  • mybatis-plus 的 saveBatch 方法相比單條循環插入在性能上有所提升,但仍然不夠理想。
  • JDBC 的 executeBatch 方法在默認情況下性能與 mybatis-plus 的 saveBatch 類似,但通過設置 rewriteBatchedStatements 參數為 true 可顯著提高性能。
  • rewriteBatchedStatements 參數的作用是將一批插入拼接成 insert into xxx values (a),(b),(c)... 這樣的一條語句形式,提高了性能。

優化建議

如果您在項目中需要進行批量插入操作,我建議考慮以下優化方案:

  • 如果使用 mybatis-plus,可以嘗試將 JDBC 連接字符串中的 rewriteBatchedStatements 參數設置為 true,以提高 saveBatch 方法的性能。
責任編輯:武曉燕 來源: springboot葵花寶典
相關推薦

2025-05-30 08:20:54

2024-11-12 08:20:31

2025-04-08 08:20:33

2024-10-24 08:21:33

2024-12-02 00:59:30

Spring

2022-12-12 08:14:47

2025-04-22 08:20:51

2025-03-06 08:21:02

判空entity對象

2025-08-19 10:01:43

2025-02-28 08:21:00

2025-07-14 00:00:00

接口重試MQTT冪等性

2020-11-03 16:00:33

API接口微服務框架編程語言

2025-03-11 08:20:58

2021-09-27 07:56:41

MyBatis Plu數據庫批量插入

2022-09-29 10:06:56

SQLMySQL服務端

2025-04-02 12:20:00

開發代碼函數

2021-10-09 06:59:36

技術MyBatis數據

2020-11-23 10:50:27

MySQLSQL數據庫

2013-09-22 10:25:23

MySQLSQL性能優化

2024-11-28 19:03:56

點贊
收藏

51CTO技術棧公眾號

久久午夜av| 在线播放成人| 久久久精品国产免大香伊| 国产精品aaaa| 亚洲精品卡一卡二| 久久a爱视频| 欧美日韩在线一区二区| 欧洲精品视频在线| 中文字幕一区二区三区人妻不卡| 亚洲一二三四| 成年人国产精品| 国产成人一区二区三区小说| 好吊日在线视频| 五月综合久久| 日韩一区二区三区观看| 亚洲精品一区二区三区四区五区| 国内精品国产成人国产三级| 午夜综合激情| 久久国产天堂福利天堂| 中国毛片在线观看| 国产伦精品一区二区三区在线播放 | av在线免费一区| 国产91露脸合集magnet| 国产精品狼人色视频一区| 国产精品美女毛片真酒店| 日韩大片在线观看| 色美美综合视频| 蜜桃视频一区二区在线观看| av资源在线观看免费高清| 成人av电影在线| 91黄色精品| 中文字幕在线网站| 日韩精品久久久久久久电影99爱| 欧美精品一区二区三区在线播放 | 在线天堂新版最新版在线8| 亚洲欧美偷拍三级| 亚洲欧洲日韩综合二区| 欧美性孕妇孕交| k8久久久一区二区三区| 999精品在线观看| 国产欧美日韩综合精品一区二区三区| 久久国产精品99国产| 456亚洲影院| 国产无码精品久久久| 亚洲视频福利| 高清欧美性猛交xxxx| 欧美成人精品欧美一级| 欧美一区视频| 九九综合九九综合| 波多野结衣爱爱视频| 性xxxx欧美老肥妇牲乱| www国产91| 国产日产精品一区二区三区的介绍| 欧美日韩伦理| 日韩中文字幕av| 午夜免费看毛片| 国产一区二区三区朝在线观看| 色综合中文字幕| 成人在线观看黄| 偷拍精品精品一区二区三区| 日韩欧美在线视频观看| 国产一区二区视频免费在线观看 | 国产精品欧美在线| 中文字幕第一页在线播放| 全国精品久久少妇| 国产乱肥老妇国产一区二| 一本到在线视频| 国产综合久久久久影院| 91影院未满十八岁禁止入内| 日本人妻熟妇久久久久久| www.欧美日韩| 水蜜桃亚洲精品| 黄色在线播放网站| 亚洲国产一区二区视频| 欧美精品99久久| 亚洲天堂1区| 制服丝袜亚洲播放| 国产xxx在线观看| 亚洲精品无吗| 制服.丝袜.亚洲.另类.中文 | yy6080久久伦理一区二区| 欧美性色综合网| 亚洲热在线视频| 欧美美女在线直播| 在线观看日韩欧美| 欧美爱爱小视频| 久久国产欧美| 91麻豆国产语对白在线观看| 欧美熟妇另类久久久久久不卡 | 久久99国产精品久久| 亚洲综合第一页| 天堂中文在线资| 国产精品国产三级国产专播品爱网| japanese在线视频| 色老头在线一区二区三区| 欧美日韩国产免费| 一级特级黄色片| 美女精品视频在线| 日韩精品极品视频免费观看| 91免费在线看片| 在线精品观看| 国产欧美婷婷中文| 少妇人妻偷人精品一区二区| 国产精品三级久久久久三级| 日韩一级免费看| 黄色日韩网站| 日韩精品免费综合视频在线播放 | 国产精品国产亚洲伊人久久| www.av日韩| 中文字幕成人av| 人人妻人人做人人爽| 蜜桃视频网站在线| 狠狠色狠狠色综合日日小说| 亚洲一区二区在线视频观看| 亚洲调教一区| 欧美黄色www| 欧美日韩成人免费观看| 视频在线观看91| 国产视频在线观看一区| 日本高清在线观看wwwww色| 欧美激情中文不卡| 男女私大尺度视频| 亚洲精品伊人| 最好看的2019的中文字幕视频| 国产乱码久久久久久| 九一九一国产精品| 神马影院我不卡午夜| 欧产日产国产精品视频| 日韩一区二区在线观看| 欧美性生交大片| 欧美.日韩.国产.一区.二区| 国产精品男人爽免费视频1| 五月天激情婷婷| 亚洲一区二区精品久久av| 天堂av8在线| 日韩欧美二区| 国产精品免费一区二区三区都可以| 欧洲伦理片一区 二区 三区| 天天影视涩香欲综合网| 性活交片大全免费看| 欧美 日韩 国产一区二区在线视频 | 国产精品高清一区二区| 中文字幕久热精品在线视频| 自拍偷拍校园春色| 国产欧美视频一区二区三区| 欧美少妇性生活视频| 国产中文精品久高清在线不| 茄子视频成人在线| 黄色污污视频软件| 久久影院电视剧免费观看| 乱妇乱女熟妇熟女网站| 欧美男男freegayvideosroom| 欧美激情精品久久久久久| 超碰人人人人人人| 亚洲在线视频网站| 欧美双性人妖o0| av成人天堂| 美女亚洲精品| 日本精品在线一区| 少妇久久久久久| 国产精品视频久久久久久| 自拍偷拍亚洲欧美日韩| 色欲无码人妻久久精品| 天堂日韩电影| 青青草国产精品一区二区| 黄色小视频在线免费观看| 91国偷自产一区二区三区成为亚洲经典 | 九一国产精品视频| 啪啪国产精品| 国产精品91久久| 日本在线免费| 日韩美女在线视频 | a级毛片免费观看在线 | 欧美日韩在线精品一区二区三区激情综| 精品福利在线观看| 中文字幕在线1| 精品影视av免费| 国产免费一区二区视频| 亚洲成a人片77777在线播放| 国产精品18久久久久久首页狼| 欧美尤物美女在线| 亚洲精品一区二区三区精华液| 精品国产乱码一区二区| 久久精品国产一区二区三| 2025韩国大尺度电影| 波多野结衣欧美| 日韩av免费在线看| 黄色一级大片在线免费看产| 亚洲第一av网| 中文字幕网址在线| 亚洲国产视频一区二区| 国产精品一二三区在线观看| 国产一区视频网站| 波多野结衣家庭教师视频| 亚洲精品a级片| 蜜桃传媒视频麻豆一区| 国产日韩一区二区三免费高清| 91av视频在线免费观看| 秋霞成人影院| 亚洲欧美日韩精品| 国产黄a三级三级看三级| 一本色道久久综合狠狠躁的推荐 | 国产日本欧美一区| aa国产成人| 久久亚洲一区二区三区四区五区高 | 尤物一区二区三区| 亚洲丁香日韩| αv一区二区三区| а√天堂资源国产精品| 2024亚洲男人天堂| 欧美日韩经典丝袜| 日日摸夜夜添一区| 国产小视频福利在线| 欧美v国产在线一区二区三区| 免费又黄又爽又猛大片午夜| 亚洲一二三四在线观看| 一区二区国产精品精华液| 久久综合色之久久综合| 最新中文字幕日本| 精品一区二区av| 三级a在线观看| 一区二区91| 国产日韩av网站| 女人色偷偷aa久久天堂| 自拍偷拍99| 日韩精品欧美| 日日噜噜噜噜夜夜爽亚洲精品| 美国成人xxx| 超碰97国产在线| 久久av偷拍| 成人亚洲欧美一区二区三区| 黄色成人在线观看网站| 国产精品激情av电影在线观看| 中文字幕在线免费观看视频| 97人人模人人爽人人喊中文字| 日韩另类在线| 久久99精品久久久久久噜噜| 二区三区四区高清视频在线观看| 中文字幕日韩欧美在线| a天堂中文在线88| 中文字幕成人精品久久不卡| 你懂的免费在线观看| 日韩精品视频在线免费观看 | 少妇高潮久久77777| av电影在线网| 在线视频欧美日韩| 91在线看片| www.xxxx精品| 成人直播在线| 欧美精品久久久久久久久久| 色女人在线视频| 久久全球大尺度高清视频| 成入视频在线观看| 欧美一区二区三区四区在线| 在线免费日韩片| 国产精品久久久久久久电影| 国产精品毛片久久久久久久久久99999999| 国产成人a亚洲精品| 成人午夜sm精品久久久久久久| 国产精品日韩一区| 91丨精品丨国产| 99热99热| 天天躁日日躁成人字幕aⅴ| 欧美国产综合视频| 日韩在线综合| a天堂资源在线观看| 国产精品久久久久9999高清| 日韩精品久久一区二区三区| 成人亚洲一区二区| 日本丰满少妇黄大片在线观看| 欧美天堂亚洲电影院在线观看 | 91欧美大片| 超碰人人爱人人| 一本色道久久综合亚洲精品高清| 熟妇人妻va精品中文字幕| 美腿丝袜亚洲色图| 国产人妻精品午夜福利免费| 91在线porny国产在线看| 性猛交ⅹxxx富婆video| 亚洲视频 欧洲视频| 日韩污视频在线观看| 91国产成人在线| av在线亚洲天堂| 欧美va亚洲va在线观看蝴蝶网| 涩爱av在线播放一区二区| 中文字幕日韩在线视频| 韩国成人免费视频| 国产精品久久久久一区二区| 视频精品二区| 日本一区二区精品| 精品按摩偷拍| 日韩在线观看电影完整版高清免费| 久久精品欧美一区| 少妇无码av无码专区在线观看| 青青草国产精品97视觉盛宴| 日韩大尺度视频| 久久精品视频在线免费观看| 欧美精品xxxxx| 欧美无砖专区一中文字| 日本xxxx人| 久久亚洲影音av资源网| 国产另类xxxxhd高清| 国产富婆一区二区三区 | 色偷偷91综合久久噜噜| 2001个疯子在线观看| 91精品美女在线| 自拍视频一区| 一卡二卡三卡视频| 国模无码大尺度一区二区三区| 激情综合丁香五月| 亚洲男人电影天堂| 欧美男人天堂网| 日韩电影网在线| 污污片在线免费视频| 国产精品一区二区三区久久| 亚洲毛片免费看| 真实国产乱子伦对白视频| 久久99最新地址| 成都免费高清电影| 精品成人久久av| 黄色片网站免费在线观看| 欧美猛交免费看| 色8久久久久| 亚洲午夜精品久久久中文影院av | 一区二区国产盗摄色噜噜| 中文字幕乱码视频| 一区二区三区天堂av| 欧美xxxhd| 国产欧美一区二区在线播放| 欧美日韩免费观看一区=区三区| 亚洲精品www.| 亚洲国产成人自拍| 无码人妻精品一区二| 在线观看一区不卡| 日韩精品123| 欧美一级在线播放| 中日韩免视频上线全都免费| 尤物av无码色av无码| av中文字幕不卡| 国产做受高潮漫动| 日韩av在线资源| 久久男人天堂| 免费精品视频一区| 性欧美长视频| 国产中年熟女高潮大集合| 日本韩国欧美一区二区三区| 你懂的免费在线观看视频网站| 日本精品久久久久久久| 国产日韩视频在线| 亚洲精品高清无码视频| 亚洲国产精品传媒在线观看| 在线免费观看国产精品| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 日本一级特级毛片视频| 9191精品国产综合久久久久久| 日韩在线资源| 91中文字幕在线| 黄色亚洲免费| 中文字幕丰满孑伦无码专区| 欧美日韩在线免费| 第一福利在线| 国产在线观看精品一区二区三区| 色135综合网| 天天操精品视频| 午夜视频一区在线观看| 水莓100国产免费av在线播放| 热久久这里只有| 久久麻豆精品| 亚洲成a人片在线www| 精品久久久久久国产91| 成人亚洲综合天堂| 92福利视频午夜1000合集在线观看| 欧美精品一级| 国产精品第七页| 欧美日韩性生活| 波多野结依一区| 日韩国产伦理| 国产一区在线不卡| av黄色在线看| 精品国内自产拍在线观看| www.国产精品一区| 日本男人操女人| 尤物在线观看一区| 欧美高清电影在线| 91探花福利精品国产自产在线| 亚洲成色精品| 美国黑人一级大黄| 精品国产在天天线2019| 成人视屏在线观看| 青青草视频在线视频| 久久久久亚洲综合| 亚洲成人一级片| 国产精品高潮呻吟久久av黑人| 欧美激情四色| 免费看裸体网站| 亚洲成人三级在线| 全球中文成人在线| 两根大肉大捧一进一出好爽视频| 国产精品久久久久久亚洲伦 | 日韩免费一级|