Heim  >  Artikel  >  Java  >  Wie kann die Wiederverwendung von PreparedStatement für mehrere Iterationen optimiert werden?

Wie kann die Wiederverwendung von PreparedStatement für mehrere Iterationen optimiert werden?

DDD
DDDOriginal
2024-10-27 16:33:29603Durchsuche

 How to Optimize PreparedStatement Reusage for Multiple Iterations?

Wiederverwendung eines PreparedStatement mit mehreren Iterationen

In Fällen, in denen eine einzelne, gemeinsame Verbindung ohne Verbindungspool verwendet wird, kann die Frage auf Sie stoßen ob es effizienter ist, für jede DML- oder SQL-Operation eine neue PreparedStatement-Instanz zu erstellen und gleichzeitig die Vorteile vorbereiteter Anweisungen zu erhalten.

Anstelle von:

<code class="java">for (int i=0; i<1000; i++) {
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setObject(1, someValue);
    preparedStatement.executeQuery();
    preparedStatement.close();
}

Sie können Folgendes in Betracht ziehen:

<code class="java">PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i=0; i<1000; i++) {
    preparedStatement.clearParameters();
    preparedStatement.setObject(1, someValue);
    preparedStatement.executeQuery();
}
preparedStatement.close();

Während der zweite Ansatz einen leichten Effizienzgewinn bietet, liegt eine überlegene Lösung in der Batch-Ausführung:

<code class="java">public void executeBatch(List<Entity> entities) throws SQLException { 
    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL);
    ) {
        for (Entity entity : entities) {
            statement.setObject(1, entity.getSomeProperty());
            // ...

            statement.addBatch();
        }

        statement.executeBatch();
    }
}</code>

Dieser Ansatz nutzt die von JDBC-Treibern bereitgestellten Batch-Funktionen und reduziert so die Anzahl der Roundtrips zur Datenbank und Steigerung der Effizienz. Sie können die Optimierung weiter optimieren, indem Sie eine Stapelgrößenbeschränkung definieren, z. B. die Ausführung alle 1000 Elemente:

<code class="java">public void executeBatch(List<Entity> entities) throws SQLException { 
    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL);
    ) {
        int i = 0;

        for (Entity entity : entities) {
            statement.setObject(1, entity.getSomeProperty());
            // ...

            statement.addBatch();
            i++;

            if (i % 1000 == 0 || i == entities.size()) {
                statement.executeBatch(); // Execute every 1000 items.
            }
        }
    }
}</code>

In Multithread-Umgebungen können Sie die Thread-Sicherheit gewährleisten, indem Sie sowohl die Verbindung als auch die Anweisung innerhalb kürzester Zeit abrufen und schließen möglichen Umfang mithilfe der try-with-resources-Anweisung, wie in den Codeausschnitten oben gezeigt. Deaktivieren Sie für Transaktionsstapel die automatische Festschreibung und schreiben Sie die Transaktion erst fest, nachdem alle Stapel abgeschlossen sind.

Das obige ist der detaillierte Inhalt vonWie kann die Wiederverwendung von PreparedStatement für mehrere Iterationen optimiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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