Rumah >Java >javaTutorial >Cara menggunakan springboot+mybatis untuk memasukkan sejumlah besar data dengan cepat
Gunakan gelung for untuk menyisipkan data satu demi satu; ),('cc','123')...
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.
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.
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
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>
@SpringBootApplication //引导类核心注解 @EnableScheduling //开启定时任务 public class BatchApplication { public static void main(String[] args) { SpringApplication.run(BatchApplication.class,args); } }
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 # 别名
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.
@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
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
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 projek10. >
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!