精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲一区在线免费| 欧美专区中文字幕| 极品人妻一区二区| 美女扒开腿让男人桶爽久久软| 91免费在线视频观看| 国产精品入口尤物| 久久精品美女视频| 成人国产精品一级毛片视频| 精品国产乱码久久久久久夜甘婷婷| 精品国产一二三四区| 999国产在线视频| 粉嫩一区二区三区性色av| 91a在线视频| 久久国产波多野结衣| 国产成人精品亚洲线观看| 欧美三日本三级三级在线播放| 97干在线视频| 日本欧美在线视频免费观看| 97久久久精品综合88久久| 成人激情黄色网| 在线视频一区二区三区四区| 欧美日韩1区| 最新亚洲国产精品| 中文字幕国产综合| 国产精品白浆| 欧美一区二区精品久久911| 日本激情视频在线| 亚洲v.com| 亚洲福利视频一区| 特级西西444| av在线日韩国产精品| 94色蜜桃网一区二区三区| 亚洲一区二区三区视频| 中文字幕在线视频免费| 久热国产精品| 欧美最近摘花xxxx摘花| 中日韩精品视频在线观看| 欧美成人日本| 久久久精品国产亚洲| 婷婷综合在线视频| 欧美日韩有码| 亚洲欧美精品中文字幕在线| 中国一级特黄录像播放| 一区二区亚洲视频| 日韩视频免费观看高清在线视频| 一路向西2在线观看| 日韩av电影资源网| 91黄色免费版| 福利在线一区二区三区| 怡红院成人在线| 色婷婷久久久亚洲一区二区三区 | 国产欧美精品一区二区三区| 99久久精品国产一区色| 国产精品一区二区免费不卡| 99porn视频在线| 亚洲av综合色区无码一二三区| 国内精品伊人久久久久影院对白| 成人精品一区二区三区| 国产视频在线观看视频| 国产乱人伦精品一区二区在线观看 | 国产精品影视网| 97在线中文字幕| 丰满人妻一区二区三区无码av | 欧美黄色aaa| 欧美暴力喷水在线| 久久久久久久久久国产| 日韩av一二三区| 西西人体一区二区| 国产精品久久二区| 国产又粗又长视频| 国产成人精品亚洲日本在线桃色| 国产传媒一区| 欧美亚洲日本| 国产精品乱人伦中文| 公共露出暴露狂另类av| 蜜臀av在线| 黑人巨大精品欧美一区二区免费 | 色婷婷综合成人av| 精品国产乱码久久久久久鸭王1| 欧美另类亚洲| 欧洲午夜精品久久久| 国产99久久久久久免费看| 久久99精品久久久久久| 91福利视频导航| 亚州视频一区二区三区| 国产精品天美传媒| 日本福利视频在线观看| 亚洲妇女成熟| 欧美喷潮久久久xxxxx| xxxx国产视频| 免费欧美一区| 欧美成年人在线观看| 国产精品一区二区6| 免费在线欧美视频| 国产精品免费一区二区三区观看| 成人在线观看网站| 亚洲自拍另类综合| 一区二区三区韩国| 91久久偷偷做嫩草影院电| 亚洲欧洲自拍偷拍| 九九热精品在线观看| 免费久久99精品国产自在现线| 成人疯狂猛交xxx| 四虎影视在线观看2413| 亚洲人成网站色在线观看| 日韩中文字幕三区| 精品国模一区二区三区欧美| 亚洲欧美国产视频| 久久99久久久| 精品一区免费av| 欧美日韩免费观看一区| 午夜伦理在线视频| 欧美日韩情趣电影| 性少妇bbw张开| 亚洲午夜视频| 91久久久久久久| www在线播放| 狠狠色狠狠色综合日日五| 精产国品一二三区| 日韩视频在线观看| 日韩av免费在线看| 深爱激情五月婷婷| 一区二区三区高清| www.五月天色| 欧美色网址大全| 97国产精品视频人人做人人爱| 国产一区二区三区四区视频| 国产亚洲美州欧州综合国| 日本中文字幕网址| www.久久东京| 欧美情侣性视频| 亚洲影院一区二区三区| 国产三级欧美三级| 免费日韩视频在线观看| 国产精品男女| 97视频在线观看免费| www.com在线观看| 亚洲精品一二三| 国产女同无遮挡互慰高潮91| 久久精品国产亚洲夜色av网站| 国产99久久精品一区二区 夜夜躁日日躁 | 中日韩美女免费视频网址在线观看| 国产无码精品在线播放| 丰满放荡岳乱妇91ww| 91黄色在线看| 狼人精品一区二区三区在线| 欧美精品九九久久| 黄色小视频免费在线观看| 一区二区日韩电影| 特级特黄刘亦菲aaa级| 好看的av在线不卡观看| 成人久久18免费网站漫画| 中文字幕在线观看播放| 日韩欧美国产一区二区在线播放| 久草免费在线观看视频| 成人午夜激情影院| 五十路熟女丰满大屁股| 日韩精选在线| 国产精品热视频| 日本激情在线观看| 欧美一级二级三级蜜桃| 久久综合亚洲色hezyo国产| 成人av午夜影院| 久久精品午夜福利| 大片网站久久| 亚洲在线观看视频| 7777kkk亚洲综合欧美网站| 亚洲国产精品va在线看黑人动漫| 国产精品视频免费播放| 欧美国产亚洲另类动漫| 红桃视频 国产| 欧美特黄视频| 欧美激情论坛| 日韩大陆av| 久久久久久久久久国产精品| 日本人妖在线| 欧美日本韩国一区二区三区视频| 东方av正在进入| 99视频一区二区三区| 超碰影院在线观看| 小说区亚洲自拍另类图片专区| 成人91视频| 网友自拍亚洲| 欧美成人四级hd版| 色哟哟在线观看| 欧美精品一二三四| 91午夜视频在线观看| 欧美国产精品劲爆| 国产性猛交96| 日本不卡视频在线观看| 国产 欧美 日韩 一区| 色综合中文网| 91九色在线观看| 日韩一区二区三区在线免费观看| 欧美xxxx18性欧美| 国产精品久久一区二区三区不卡| 91精品国产综合久久香蕉麻豆| 日韩成人免费观看| 亚洲少妇30p| 成人精品999| 高清视频一区二区| 一路向西2在线观看| 亚洲少妇一区| 玖玖精品在线视频| 成人午夜国产| 精品一区二区不卡| 日韩精品成人在线观看| 国产精品都在这里| 19禁羞羞电影院在线观看| 日韩在线视频观看正片免费网站| 天天干天天干天天干| 777奇米成人网| 中国一级特黄视频| 欧美日韩亚洲视频一区| 久久免费视频播放| 亚洲天堂2014| 免费一级黄色录像| 2020国产精品| 91av在线免费| jizz一区二区| 午夜性福利视频| 精品一区二区三区欧美| 91视频免费版污| 久久久久久久高潮| 成人免费在线小视频| 亚洲黄色成人| 日韩黄色片在线| 亚洲成人99| 亚洲一区三区| 日韩毛片视频| 秋霞毛片久久久久久久久| 欧美美女在线直播| 国产三区精品| 久久婷婷国产| 激情欧美一区二区三区中文字幕| 在线精品自拍| 91久久国产自产拍夜夜嗨| 亚洲老司机网| 成人亚洲激情网| 成人日韩视频| 亚洲mm色国产网站| 国产精品毛片无码| 91牛牛免费视频| 麻豆国产一区| 97夜夜澡人人双人人人喊| 亚洲一区二区免费在线观看| 91九色对白| 91精品久久久久久综合五月天| 5g国产欧美日韩视频| 99国产精品久久一区二区三区| 亚洲精品欧美一区二区三区| 欧美成人精品一级| 俄罗斯精品一区二区| 97超碰成人| 国产一区二区三区无遮挡| 露出调教综合另类| 人禽交欧美网站免费| 欧洲毛片在线视频免费观看| 欧美一区二区三区四区在线观看地址 | 日韩精品视频观看| 国产在线网站| 色老头一区二区三区| 国内精品久久久久国产| 久久精品中文字幕一区| 午夜小视频在线观看| 91精品国产91久久久久久不卡| 美女100%一区| 91精品美女在线| 东京久久高清| 日韩精品久久久| 亚洲综合色网| 久久视频这里有精品| 久热综合在线亚洲精品| 亚洲一区精品视频在线观看| 国产成人在线视频网站| 超碰男人的天堂| 国产精品久线在线观看| 久久久久久久久97| 日本福利一区二区| 国产国语亲子伦亲子| 亚洲精品国精品久久99热一| 国产高清视频免费最新在线| 久久成人亚洲精品| 精品91久久| 亚洲一区二区三区在线视频| 欧美一区 二区| 中文字幕日韩一区二区三区不卡| 国内精品99| 亚洲一区在线不卡| 国产成人免费视频一区| 国产一区二区三区精品在线| 一区二区三区欧美| 国产九色91回来了| 精品国产制服丝袜高跟| 国产黄色在线| 992tv在线成人免费观看| 久久国内精品| 精品亚洲一区二区三区四区五区高| 国产大片一区| 男人天堂999| 国产98色在线|日韩| 国产精品av久久久久久无| 亚洲aⅴ怡春院| 国产精品一二三四五区| 亚洲人在线观看| 超碰在线最新网址| 91中文字幕在线| 国产欧美高清视频在线| 天堂…中文在线最新版在线| 精品一区二区在线观看| 免费看污片网站| 亚洲不卡av一区二区三区| 国产精品日韩无码| 亚洲性夜色噜噜噜7777| 成av人片在线观看www| 91在线观看免费| 久久精品国产68国产精品亚洲| avav在线看| 91小视频在线免费看| 精品在线视频观看| 日韩一区二区在线免费观看| 91这里只有精品| 国产91九色视频| 亚洲自拍电影| 国模吧无码一区二区三区| 成人精品国产一区二区4080| 丝袜 亚洲 另类 欧美 重口| 欧美精品久久一区| 色的视频在线免费看| 国产精品视频导航| 精品美女视频| 天天爽天天爽夜夜爽| 久久蜜臀中文字幕| 欧美一级片免费在线观看| 亚洲国产精品久久久久久| 欧美人与性动交α欧美精品济南到| 国产精品自产拍在线观看| 欧美日韩黑人| 国产91色在线观看| 中文一区二区完整视频在线观看| 手机在线看片1024| 亚洲欧美在线播放| 婷婷激情一区| 日韩资源av在线| 热久久免费视频| 国产精品无码无卡无需播放器| 欧美视频第二页| 午夜免费福利在线观看| 国产日产欧美a一级在线| 久久一区二区三区喷水| 亚洲18在线看污www麻豆| 中文字幕一区二区视频| 国产男男gay体育生白袜| 欧美成人手机在线| 久久久精品国产**网站| 黄色片久久久久| 国产欧美日韩在线观看| 一本色道久久综合熟妇| 久久精品久久久久久国产 免费| 精品国产一区二| 成人毛片一区二区| 久久久久久久久久看片| 中文字幕理论片| 欧美精品一二区| 欧美三级午夜理伦三级在线观看| 91猫先生在线| 国产精品久久99| 亚洲欧美强伦一区二区| 欧洲一区二区视频| 亚欧美无遮挡hd高清在线视频| 亚洲成人av免费观看| 欧美日韩精品二区| 97超碰人人在线| 国产超碰91| 丝袜诱惑制服诱惑色一区在线观看| 亚洲a∨无码无在线观看| 欧美成人激情免费网| 亚洲天堂手机| 成人短视频在线看| 99久久精品国产毛片| 18国产免费视频| 欧美二区乱c黑人| 日韩美女国产精品| 在线观看免费不卡av| 亚洲成人av在线电影| 91官网在线| 精品视频在线观看| 免费在线成人网| 日本三级2019| 精品国产一区二区三区四区在线观看| 国产一区二区三区不卡av| 中国黄色片免费看| 偷偷要91色婷婷| 超碰在线最新| 午夜精品亚洲一区二区三区嫩草 | 麻豆福利在线观看| 亚洲mv在线看| av网站免费线看精品| 亚洲综合网av| 国产不卡在线观看|