Heim  >  Artikel  >  Java  >  So verwenden Sie Springboot + Mybatis, um schnell große Datenmengen einzufügen

So verwenden Sie Springboot + Mybatis, um schnell große Datenmengen einzufügen

WBOY
WBOYnach vorne
2023-05-12 08:19:161869Durchsuche

1. JDBC-Implementierungsplan

Verwenden Sie eine for-Schleife, um Daten einzeln einzufügen. ,'123')...

Die erste Lösung besteht darin, eine for-Anweisungsschleife zum Einfügen zu verwenden:

Der Vorteil dieser Lösung besteht darin, dass PreparedStatement in JDBC über eine Vorkompilierungsfunktion verfügt und nach der Vorkompilierung zwischengespeichert wird -Zusammenstellung. Danach erfolgt die SQL-Ausführung schneller und JDBC kann die Stapelverarbeitung ermöglichen. Diese Stapelverarbeitungsausführung ist sehr leistungsstark.

Der Nachteil besteht darin, dass unser SQL-Server und unser Anwendungsserver oft nicht identisch sind, sodass Netzwerk-E/A berücksichtigt werden muss. Wenn Netzwerk-E/A zeitaufwändig ist, kann dies die SQL-Ausführung verlangsamen.

Die zweite Möglichkeit besteht darin, ein SQL zum Einfügen zu generieren:

Der Vorteil dieser Option besteht darin, dass es nur einen Netzwerk-IO gibt. Selbst beim Sharding sind nur wenige Netzwerk-E/A erforderlich, sodass diese Lösung nicht zu viel Zeit für Netzwerk-E/A aufwendet.

Natürlich hat diese Lösung auch Nachteile. Erstens ist die SQL zu lang und erfordert möglicherweise sogar eine Stapelverarbeitung nach dem Sharding. Zweitens können die Vorteile der PreparedStatement-Vorkompilierung nicht vollständig genutzt werden, und die SQL muss erneut analysiert werden und kann drittens nicht wiederverwendet werden ist zu lang und der Datenbankmanager muss es auch zeitaufwendig analysieren.

Wir werden die zweite Lösung verwenden, um sie als nächstes umzusetzen.

2. Spezifische Implementierungsideen

Wenn wir die Einfügungseffizienz definitiv nicht erhöhen können, müssen wir foreach für die Stapeleinfügung verwenden.

Verwenden Sie Multithreading für die asynchrone Einfügung Es ist unmöglich, mehrere Einfügungsvorgänge gleichzeitig einzureichen. Dies ist sehr zeitaufwändig und kann nicht in kurzer Zeit durchgeführt werden.

Als nächstes sprechen wir darüber, wie man Code zur Implementierung verwendet.

3. Code-Implementierung

Dieser Fall basiert hauptsächlich auf der Integration von Mybatis durch SpringBoot.

1. Abhängigkeiten importieren

    <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>

3. Konfigurationsdatei application.yml

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

4. Tabelle und Entitätsklasse erstellen:

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  # 别名

erhöht sich schneller als INNODB. „User.java“ SpringBoot integriert sched standardmäßig uled , verwenden Die Schritte lauten wie folgt:

Fügen Sie die Annotation @EnableScheduling zur Boot-Klasse hinzu, um geplante Aufgaben zu aktivieren. Fügen Sie die Annotation @Scheduled zur Business-Layer-Methode hinzu, um die regelmäßige Ausführung des Cron-Ausdrucks zu definieren.

Die in der Business-Layer-Methode gestarteten Threads können entsprechend der aktuellen Maschinenkonfiguration geändert werden. Wir haben hier 7 Threads geöffnet, und jeder Thread führt 20 Schleifen aus und fügt jeweils 5.000 Daten hinzu. Hierbei ist zu beachten, dass beim Batch-Einfügen von mybatis nicht empfohlen wird, 10.000 Fehler zu überschreiten. Da die Datenmenge zu groß ist, besteht die Gefahr eines Stapelspeicherüberlaufs.

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
7. Util zum Generieren von Objekten

Wir verwenden es, um die Generierung von Daten zu simulieren, die in die tatsächliche Geschäftsentwicklung eingefügt werden sollen. Es können aus Excel importierte Daten sein.

@Data
public class User {
    private int id;
    private String username;
    private String pwd;
    private int sex;
    private LocalDate birthday;
}

8. Thread-Pool-Konfiguration

Thread-Pool-Parameter:

corePoolSize Anzahl der Kern-Threads, die minimale Anzahl von Threads, die im Thread-Pool garantiert werden sollen; mainumPoolSize maximale Anzahl von Threads, die kann im Thread-Pool ausgeführt werden;

keepAliveTime garantiert die Überlebenszeit, wenn der Thread inaktiv ist, wie lange es dauert, den Thread zu recyceln;

unit wird in Verbindung mit keepAliveTime, der Zeiteinheit, verwendet , wird zum Speichern von Aufgaben verwendet, bevor sie ausgeführt werden.

@Mapper
public interface UserMapper {
    void insertBatch(@Param("userList") List<User> userList);
}

9. Vollständige Projektstruktur

10

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Springboot + Mybatis, um schnell große Datenmengen einzufügen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen