Inhaltsverzeichnis
1. Beschreibung
2. Einführung in das Experiment
Sehen Sie sich das allgemeine Protokoll an
四、存储过程
Heim Java javaLernprogramm So implementieren Sie JDBC-Batch-Insert in Java

So implementieren Sie JDBC-Batch-Insert in Java

May 18, 2023 am 10:02 AM
java jdbc

    1. Beschreibung

    In JDBC kann die Methode „executeBatch“ mehrere DML-Anweisungen stapelweise ausführen, und die Effizienz ist viel höher als die einzelne Ausführung von „executeUpdate“. Wie implementiert man die Batch-Ausführung in MySQL und Oracle? Dieser Artikel stellt Ihnen das Prinzip dahinter vor.

    2. Einführung in das Experiment

    Dieses Experiment wird in den folgenden drei Schritten durchgeführt:a Zeichnen Sie den Zeitaufwand für die Stapelausführung und die Einzelausführung von JDBC auf und Einzelausführung von JDBC in Oracle

    c Zeichnen Sie die zeitaufwändige Ausführung von Oracle Plsql und Einzelausführung auf

    Die relevanten Java- und Datenbankversionen sind wie folgt: Java17, Mysql8, Oracle11G

    Erstellen eine Tabelle in MySQL bzw. Oracle

    create table t (  -- mysql中创建表的语句
        id    int,
        name1 varchar(100),
        name2 varchar(100),
        name3 varchar(100),
        name4 varchar(100)
    );
    Nach dem Login kopieren
    create table t (  -- oracle中创建表的语句
        id    number,
        name1 varchar2(100),
        name2 varchar2(100),
        name3 varchar2(100),
        name4 varchar2(100)
    );
    Nach dem Login kopieren

    Vor dem Experiment müssen Sie die Prüfung der Datenbank aktivieren

    Ein paar Punkte sind im Code zu beachten:

    MySQL-URL muss hinzugefügt werden useServerPrepStmts= true&rewriteBatchedStatements=true Parameter.

    batchCnt stellt die Anzahl der in jedem Stapel ausgeführten SQL-Anweisungen dar, und 0 steht für eine einzelne Ausführung.

    Erster MySQL-Test

    set global general_log = 1;
    Nach dem Login kopieren

    Geben Sie verschiedene BatchCnt-Werte ein, um die Ausführungszeit anzuzeigen
    • batchCnt=50 Gesamtzahl der Elemente: 10000, Einfügung pro Stapel: 50, Gesamtzeit: 4369 Millisekunden

      batchCnt= 100 Gesamtzahl der Elemente: 10000, jeder Einfügungsstapel: 100, Gesamtzeitverbrauch: 2598 Millisekunden
    • batchCnt=200 Gesamtzahl der Elemente: 10000, jeder Einfügungsstapel: 200, Gesamtzeitverbrauch: 2211 Millisekunden
    • batchCnt=1000 Gesamt Anzahl der Elemente: 10000, jeder Stapel von Einfügungen: 1000, Gesamtzeitaufwand: 2099 Millisekunden

      batchCnt=10000 Gesamtzahl der Elemente: 10000, jeder Stapeleinfügung: 10000, Gesamtzeitaufwand: 2418 Millisekunden

      batchCnt=0 Gesamtzahl der Elemente : 10000, einzelne Einfügung, insgesamt aufgewendete Zeit: 59620 Millisekunden

    Sehen Sie sich das allgemeine Protokoll an

    batchCnt=5

    batchCnt=0


    Wir können mehrere Schlussfolgerungen ziehen:



    Die Effizienz der Stapelausführung ist im Vergleich erheblich verbessert zur Einzelausführung.

    Die Stapelausführung von MySQL schreibt SQL tatsächlich neu und führt mehrere Einfügungen zur Ausführung in Einfügung xx Werte (), () ... zusammen.

    Beim Ändern von batchCnt von 50 auf 100 verkürzt sich die Zeit grundsätzlich um die Hälfte, aber wenn der Wert erweitert wird, ist die Zeitverkürzung nicht offensichtlich und die Ausführungszeit erhöht sich sogar.

    • Analysegrund:

    • Nachdem der Client die auszuführende SQL-Anweisung an den Datenbankserver gesendet hat, führt die Datenbank die SQL-Anweisung aus und gibt das Ergebnis an den Client zurück. Gesamtzeitaufwand = Datenbankausführungszeit + Netzwerkübertragungszeit. Die Reduzierung der Anzahl der Roundtrips durch Batch-Ausführung reduziert die Netzwerkübertragungszeit und damit die Gesamtzeit. Wenn jedoch „batchCnt“ größer wird, ist die Verkürzung der Gesamtzeit nicht so offensichtlich, selbst wenn die Netzwerkübertragungszeit nicht mehr der Hauptengpass ist. Insbesondere wenn „batchCnt=10000“, also alle 10.000 Anweisungen gleichzeitig ausgeführt werden, wird die Zeit länger. Dies kann daran liegen, dass das Programm und die Datenbank bei der Vorbereitung dieser Eingabeparameter mehr Zeit benötigen. Ich schätze).
    • Noch etwas: Kann der Wert von „batchCnt“ unendlich groß sein? Angenommen, ich muss 100 Millionen Artikel einfügen. Kann ich dann 100 Millionen Artikel gleichzeitig einfügen? Natürlich nicht, wir berücksichtigen nicht das Platzproblem beim Rückgängigmachen. Erstens verfügt Ihr Computer nicht über einen so großen Speicher, um alle 100 Millionen SQL-Eingabeparameter auf einmal zu speichern. Zweitens verfügt MySQL auch über einen Parameter max_allowed_packet Die Länge einer einzelnen Anweisung beträgt maximal 1 GB. Wenn die Anweisung zu lang ist, wird die Meldung „Paket für Abfrage ist zu groß (1.773.901 > 1.599.488)“ gemeldet. Sie können diesen Wert auf dem Server ändern, indem Sie die Variable „max_allowed_packet“ festlegen. Als nächstes testen Sie Oracle Gesamtzahl der Elemente: 10000, jeder Einfügungsstapel: 100, Gesamtzeitverbrauch: 1324 Millisekunden
    • batchCnt=200 Gesamtzahl der Elemente: 10000, jeder Einfügungsstapel: 200, Gesamtzeitverbrauch: 856 Millisekunden
    • batchCnt=1000 Gesamtzahl Anzahl der Elemente: 10.000, jeder Stapel von Einfügungen: 1.000, Gesamtzeitaufwand: 785 Millisekunden

      batchCnt=10.000 Gesamtzahl der Elemente: 10.000, jeder Stapeleinfügung: 10.000, Gesamtaufwand: 804 Millisekunden

      batchCnt=0 Gesamtzahl der Elemente: 10000, einzelne Einfügung, insgesamt aufgewendete Zeit: 60830 Millisekunden

    Der Effekt der Ausführung in Oracle ist grundsätzlich der gleiche wie der in MySQL, und die Effizienz von Batch-Vorgängen ist deutlich höher als die der Einzelausführung. Das Problem besteht darin, dass es in Oracle keine solche Syntax zum Einfügen von xx-Werten(),()... gibt. Wie wird also eine Stapelausführung erreicht?

    Sehen Sie sich die Audit-Ansicht dba_audit_trail an, wenn „batchCnt=50“ ausgeführt wird

    从审计的结果中可以看到,batchCnt=50的时候,审计记录只有200条(扣除登入和登出),也就是sql只执行了200次。sql_text没有发生改写,仍然是"insert into t values (:1 , :2 , :3 , :4 , :5 )",而且sql_bind只记录了批量执行的最后一个参数,即50的倍数。根据awr报告可以看出,实际只执行了200次(由于篇幅限制,省略了awr截图)。那么oracle是怎么做到只执行200次但插入1万条记录的呢?我们来看看oracle中使用存储过程的批量插入。

    四、存储过程

    准备数据:

    首先将t表清空 truncate table t;

    用java往t表灌10万数据 exec("oracle", 100000, 1000);

    创建t1表 create table t1 as select * from t where 1 = 0;

    以下两个过程的意图一致,均为将t表中的数据导入t1表。nobatch是单次执行,usebatch是批量执行。

    create or replace procedure nobatch is
    begin
      for x in (select * from t)
      loop
        insert into t1 (id, name1, name2, name3, name4)
        values (x.id, x.name1, x.name2, x.name3, x.name4);
      end loop;
      commit;
    end nobatch;
    /
    Nach dem Login kopieren
    create or replace procedure usebatch (p_array_size in pls_integer)
    is
      type array is table of t%rowtype;
      l_data array;
      cursor c is select * from t;
    begin
      open c;
      loop
        fetch c bulk collect into l_data limit p_array_size;
        forall i in 1..l_data.count insert into t1 values l_data(i);
        exit when c%notfound;
      end loop;
      commit;
      close c;
    end usebatch;
    /
    Nach dem Login kopieren

    执行上述存储过程

    SQL> exec nobatch;  
    Elapsed: 00:00:32.92

    SQL> exec usebatch(50);
    Elapsed: 00:00:00.77

    SQL> exec usebatch(100);
    Elapsed: 00:00:00.47

    SQL> exec usebatch(1000);
    Elapsed: 00:00:00.19

    SQL> exec usebatch(100000);
    Elapsed: 00:00:00.26

    存储过程批量执行效率也远远高于单条执行。查看usebatch(50)执行时的审计日志,sql_bind也只记录了批量执行的最后一个参数,即50的倍数。与使用executeBatch方法在记录内容方面相同。因此可以推断,JDBC的executeBatch和存储过程的批量执行都采用了相同的方法

    存储过程的这个关键点就是forall。查阅相关文档。

    The FORALL statement runs one DML statement multiple times, with different values in the VALUES and WHERE clauses.
    The different values come from existing, populated collections or host arrays. The FORALL statement is usually much faster than an equivalent FOR LOOP statement.
    The FORALL syntax allows us to bind the contents of a collection to a single DML statement, allowing the DML to be run for each row in the collection without requiring a context switch each time.

    翻译过来就是forall很快,原因就是不需要每次执行的时候等待参数。

    Das obige ist der detaillierte Inhalt vonSo implementieren Sie JDBC-Batch-Insert in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
    Will R.E.P.O. Crossplay haben?
    1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

    Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

    Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

    Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

    In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

    Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

    Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

    Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

    Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

    Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

    Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

    Wie führe ich Ihre erste Spring -Boot -Anwendung in der Spring Tool Suite aus? Wie führe ich Ihre erste Spring -Boot -Anwendung in der Spring Tool Suite aus? Feb 07, 2025 pm 12:11 PM

    Spring Boot vereinfacht die Schaffung robuster, skalierbarer und produktionsbereiteter Java-Anwendungen, wodurch die Java-Entwicklung revolutioniert wird. Der Ansatz "Übereinkommen über Konfiguration", der dem Feder -Ökosystem inhärent ist, minimiert das manuelle Setup, Allo

    See all articles