[JAVA] [MyBatis] Verwenden Sie den Cursor, wenn Sie große Datenmengen zuordnen

Einführung

Während dieser Zeit bei der Arbeit beschäftigte ich mich mit einer großen Datenmenge und musste den Prozess überprüfen, der nie reagierte. Insgesamt dauerte es ca. 4 Minuten. Bei der Überprüfung dieses Prozesses habe ich Mapper in org.apache.ibatis.cursor.Cursor anstelle von List geändert. Infolgedessen konnten wir die Reaktion beschleunigen.

Da es sich um eine große Sache handelt, werde ich zusammenfassen, wie der in MyBatis 3.4 oder höher hinzugefügte Cursor verwendet wird.

Betriebsumgebung

Wie benutzt man

mapper.xml muss nicht geändert werden, wenn Sie es mit List erhalten. Da es eine große Datenmenge verarbeitet, ist es noch besser, die Größe des Caches mit fetchSize anzupassen.

mapper.xml


  <select id="getColumns" fetchSize="50000" resultType="java.lang.String">
    SELECT columns FROM table1
  </select>

Mapper.java importiert org.apache.ibatis.cursor.Cursor. Ordnen Sie den Teil \ dem SQL-Rückgabewert zu.

Mapper.java


import org.apache.ibatis.cursor.Cursor;

@Mapper
public interface Mapper {
    public Cursor<String> getColumns();
}

Dies ist der Teil, den Sie von Mapper aus aufrufen müssen. Ähnlich wie List, außer dass das Anrufergebnis im Typ Cursor \ gespeichert ist.

Der Teil, der den Wert durch Schleifenverarbeitung abruft, kann auf die gleiche Weise wie List geschrieben werden. Im Beispiel wird es in zwei Typen geschrieben, für Each und Iterator.

Service.java


@Service
public class Service {
    @Autowired
    private Mapper mapper;

    public void getMapper() {
        try (Cursor<String> columnsCorsor = mapper.getColumns()) {

            //Schleifenverarbeitung 1
            columnsCorsor.forEach(s -> {
                System.out.println(s);
            });

            //Schleifenverarbeitung 2 (Beachten Sie, dass die zweite Schleife einen Fehler verursacht !!)
            Iterator<String> iterator = columnsCorsor.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }

        } catch (Exception e) {
            e.printstacktrace();
        }
    }
}

Es ist zu beachten, dass es im Gegensatz zum Abrufen mit List ** geschlossen wird, wenn alle Daten im Cursor gelesen werden **. Wenn Sie also alle Daten auch nur einmal abrufen und dann erneut abrufen, tritt der folgende Fehler auf.

java.lang.IllegalStateException: Cannot open more than one iterator on a Cursor

Im Falle einer grundlegenden Verwendung wird die MyBatis-Seite sie schließen, sodass ich denke, dass es kein Problem gibt.

Wenn jedoch ein Fehler in der Mitte auftritt, gibt es keine Garantie dafür, dass er geschlossen wird. Schließen wir es also fest mit einer try ~ resource-Anweisung oder einer finally-Klausel beim Aufrufer.

Schließlich

Dank Cursor konnten wir die Antwort von 4 Minuten auf 2 Minuten reduzieren. (Dies ist das Ergebnis der Überprüfung anderer Teile als Cursor ...) Verwenden Sie Cursor, wenn Sie eine große Datenmenge verarbeiten.

Verschiedene Notizen

MyBatis hat nur wenige Referenzmaterialien, daher frage ich mich, ob es nur wenige Benutzer gibt. Was ist der Mainstream von DB Access Frameworks ...? MyBatis wendet Raw SQL an und ordnet es gut zu, also gefällt es mir persönlich ... ~~ Ich ärgere mich manchmal über Anmerkungen ~~

Verweise

MyBatis - MyBatis 3 | Mapper-XML-Datei Cursor | mybatis [5.2. Datenbankzugriff (MyBatis3) - TERASOLUNA Server Framework für Java (5.x) Entwicklungsrichtlinie 5.0.1.RELEASE-Dokumentation](https://terasolunaorg.github.io/guideline/5.0.1.RELEASE/de/ ArchitectureInDetail / DataAccessMyBatis3.html)

Recommended Posts

[MyBatis] Verwenden Sie den Cursor, wenn Sie große Datenmengen zuordnen
[MyBatis] Verwenden Sie den Cursor, wenn Sie große Datenmengen zuordnen
So löschen Sie große Datenmengen in Rails und Bedenken
Punkte beim Zuordnen von Wertobjekten in MyBatis