一、準備工作
測試環(huán)境:SpringBoot項目+MybatisPlus框架+MySQL數(shù)據(jù)庫+Lombok文章來源:http://www.zghlxwxcb.cn/news/detail-627116.html
二、導(dǎo)入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
三、yml配置文件
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: 123456
url: jdbc:mysql://localhost:3306/mysql?useSSL=false&characterEncoding=utf-8&useUnicode=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
##rewriteBatchedStatements=true 開啟批處理模式
四、實體類(數(shù)據(jù)庫表要有對應(yīng)字段)
package com.cy.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private Integer id;
private String username;
private String password;
}
五、測試
- 方法一:for循環(huán)插入(單條)(總耗時:n分鐘,每次都要獲取連接Connection、釋放連接和關(guān)閉資源等操作,比較耗時,這里就沒測了)
@RequestMapping("/test3") //單個插入(慢)
public String test3(){
long startTime=System.currentTimeMillis();
for(int i=0;i<100000;i++){
userService.save(new User(i+1,"張三","123456"));
}
long endTime=System.currentTimeMillis();
long result=endTime-startTime;
return "總耗時:"+(result/1000);
}
- 方法二:批量插入saveBatch(4~7秒,這里用到了MybatisPLus的saveBatch批量插入方法,實際也是for循環(huán)單條插入,只不過它是利用分片處理batchSize=1000和分批提交事務(wù),從而提高了性能,不用在Connection上消費性能了)(推薦)
@RequestMapping("/test2") //批量插入saveBatch(分片處理batchSize=1000,分批提交事務(wù)) (次快)
public String test2(){
List<User> userList=new ArrayList<>();
long startTime=System.currentTimeMillis();
for(int i=0;i<100000;i++){
userList.add(new User(i+1,"張三","123456"));
}
userService.saveBatch(userList);
long endTime=System.currentTimeMillis();
long result=endTime-startTime;
return "總耗時:"+(result/1000);
}
- 方法三:循環(huán)插入+開啟批處理模式(4~7秒,開啟批處理模式,關(guān)閉自動提交事務(wù),共同用一個sqlsession,單個插入性能得到提升,由于用同一個sqlsession,極大的減少了對資源操作和對事務(wù)處理的時間,很好地提高了性能)(推薦)
@Resource
private SqlSessionFactory sqlSessionFactory;
@RequestMapping("/test1") //批量插入(最快)---循環(huán)插入+批處理模式 ( 開啟批處理模式 rewriteBatchedStatements=true )
public String test1(){
//開啟批處理模式,關(guān)閉自動提交事務(wù)
SqlSession sqlSession= sqlSessionFactory.openSession(ExecutorType.BATCH,false);
long startTime=System.currentTimeMillis();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
for(int i=0;i<100000;i++){
userMapper.insert(new User(i+1,"張三","123456"));
}
sqlSession.commit();//一次性提交事務(wù)
sqlSession.close();//關(guān)閉資源
long endTime=System.currentTimeMillis();
long result=endTime-startTime;
return "總耗時:"+(result/1000);
}
以上就是全部內(nèi)容,希望對大家有幫助!文章來源地址http://www.zghlxwxcb.cn/news/detail-627116.html
到了這里,關(guān)于數(shù)據(jù)庫批量插入數(shù)據(jù)的三種方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!