Verwenden Sie eine for-Schleife, um Daten einzeln einzufügen. ,'123')...
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.
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.
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
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>
@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 # 别名
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
@Data public class User { private int id; private String username; private String pwd; private int sex; private LocalDate birthday; }
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;
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); }Nach dem Login kopieren9. 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!