Rumah  >  Artikel  >  Java  >  Cara menggunakan springboot+mybatis untuk memasukkan sejumlah besar data dengan cepat

Cara menggunakan springboot+mybatis untuk memasukkan sejumlah besar data dengan cepat

WBOY
WBOYke hadapan
2023-05-12 08:19:161869semak imbas

1. Pelan pelaksanaan JDBC

Gunakan gelung for untuk menyisipkan data satu demi satu; ),('cc','123')...

Penyelesaian pertama ialah menggunakan pernyataan for untuk dimasukkan dalam gelung:

Kelebihan penyelesaian ini ialah bahawa dalam JDBC PreparedStatement mempunyai fungsi pra-penyusunan dan akan dicache selepas pra-penyusunan. Selepas itu, pelaksanaan SQL akan menjadi lebih pantas, dan JDBC boleh mendayakan pemprosesan kelompok Perlaksanaan pemprosesan kelompok ini sangat berkuasa.

Kelemahannya ialah banyak kali pelayan SQL dan pelayan aplikasi kami mungkin tidak sama, jadi IO rangkaian mesti dipertimbangkan. Jika IO rangkaian memakan masa, ia mungkin melambatkan pelaksanaan SQL.

Pilihan kedua ialah menjana SQL untuk sisipan:

Kelebihan pilihan ini ialah hanya terdapat satu rangkaian IO. Malah sharding hanyalah beberapa IO rangkaian, jadi penyelesaian ini tidak menghabiskan terlalu banyak masa pada IO rangkaian.

Sudah tentu, penyelesaian ini juga mempunyai kelemahan. Pertama, SQL terlalu panjang, malah mungkin memerlukan pemprosesan kumpulan selepas sharding, kedua, kelebihan PreparedStatement pra-penyusun tidak boleh digunakan sepenuhnya, dan SQL mesti dihuraikan semula dan tidak boleh digunakan semula, ketiga, SQL yang dihasilkan; terlalu panjang, dan pengurus pangkalan data mesti menghuraikannya SQL yang begitu panjang juga memerlukan masa.

Kami akan menggunakan penyelesaian kedua untuk melaksanakannya seterusnya.

2. Idea pelaksanaan khusus

Jika kita ingin meningkatkan kecekapan sisipan, kita pasti tidak boleh memasukkan satu persatu, kita mesti menggunakan foreach untuk sisipan batch; > Gunakan berbilang benang untuk sisipan tak segerak untuk meningkatkan prestasi

Adalah mustahil untuk menyerahkan berbilang sisipan pada satu masa Sebilangan besar operasi sisipan akan memakan masa yang lama dan tidak dapat diselesaikan dalam masa yang singkat. Ia boleh dicapai dengan menggunakan tugas berjadual.

Seterusnya kita akan bercakap tentang cara menggunakan kod untuk melaksanakannya.

3. Pelaksanaan kod

Kes ini dilaksanakan terutamanya berdasarkan SpringBoot mengintegrasikan mybatis.

1. Import dependensi

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

2 Buat kelas permulaan

@SpringBootApplication  //引导类核心注解
@EnableScheduling //开启定时任务
public class BatchApplication {
    public static void main(String[] args) {
        SpringApplication.run(BatchApplication.class,args);
    }
}

3.yml

server:
  port: 9999  # 指定端口号
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    username: root
    password: 123
mybatis:
  mapper-locations: classpath:mybatis/*.xml   #指定mapper映射文件路径
  type-aliases-package: com.qfedu.model  # 别名

4 Pengguna

Buat jadual:

CREATE TABLE `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(30) DEFAULT NULL,
  `pwd` VARCHAR(20) DEFAULT NULL,
  `sex` INT(11) DEFAULT NULL,
  `birthday` DATETIME DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8
Nota: MyISAM akan lebih pantas daripada INNODB.

User.java

@Data
public class User {
    private int id;
    private String username;
    private String pwd;
    private int sex;
    private LocalDate birthday;
}
5. Pemeta lapisan kegigihan dan fail pemetaan

UserMapper.java

rreee<.>UserMapper.xml

@Mapper
public interface UserMapper {
    void insertBatch(@Param("userList") List<User> userList);
}
6 Hidupkan tugas yang dijadualkan

SpringBoot disepadukan secara lalai 🎜>Dalam but Tambahkan anotasi @EnableScheduling ke kelas untuk mendayakan tugas berjadual;

Tambah anotasi @Scheduled pada kaedah lapisan perniagaan untuk menentukan pelaksanaan berkala bagi ungkapan cron.

Benang yang dimulakan dalam kaedah lapisan perniagaan boleh diubah suai mengikut konfigurasi mesin semasa. Kami telah membuka 7 utas di sini, dan setiap utas melaksanakan 20 gelung dan menambah 5,000 keping data pada satu masa. Perlu diingatkan di sini bahawa apabila mybatis batch memasukkan, tidak digalakkan melebihi 10,000 ralat. Oleh kerana jumlah data terlalu besar, limpahan memori tindanan terdedah untuk berlaku.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qfedu.mapper.UserMapper">
    <insert id="addList" parameterType="User"  >
        insert  into user (username,pwd,sex,birthday) values
        <foreach collection="list" item="item" separator=",">
            (#{item.username}, #{item.pwd}, #{item.sex}, #{item.birthday})
        </foreach>
    </insert>
</mapper>

7. Uti yang menjana objek

digunakan untuk mensimulasikan penjanaan data yang akan dimasukkan Dalam pembangunan perniagaan sebenar, ia boleh menjadi data yang diimport dari excel.
@Component
public class UserServiceImpl {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    //线程池
    private ThreadPoolExecutor executor;
    @Scheduled(cron = "0/20 * * * * ?") //每隔20秒执行一次
    public void  addList(){
        System.out.println("定时器被触发");
        long start = System.currentTimeMillis();
        for (int i = 0; i < 7; i++) {
 
            Thread thread = new Thread(() -> {
                try {
                    for (int j = 0; j < 20; j++) {
                        userMapper.addList(UserUtil.getUsers(5000));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
            try {
                executor.execute(thread);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }
}

8. Konfigurasi kumpulan benang

Parameter kumpulan benang:

Bilangan benang teras terasPoolSize, bilangan minimum benang yang akan dijamin dalam kumpulan benang;

mainumPoolSize ialah bilangan maksimum utas, bilangan maksimum utas yang boleh dijalankan dalam kumpulan benang; untuk mengitar semula benang;

unit digunakan bersama dengan keepAliveTime , unit masa

workQueue baris gilir, digunakan untuk menyimpan tugasan sebelum tugasan dilaksanakan.

public class UserUtil {
    private static Random random = new Random();
    public static List<User> getUsers(int num){
        List<User> users = new ArrayList<>();
        for (int i = 0;i<num;i++){
            User user = new User();
            user.setBirthday(LocalDate.now());
            user.setSex(random.nextInt(2));
            user.setPwd("123"+random.nextInt(100000));
            user.setUsername("batch"+random.nextInt(num));
            users.add(user);
        }
        return users;
    }
}

9. Lengkapkan struktur projek

10. >

Atas ialah kandungan terperinci Cara menggunakan springboot+mybatis untuk memasukkan sejumlah besar data dengan cepat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam