Maison  >  Article  >  Java  >  Comment optimiser la réutilisation de PreparedStatement pour plusieurs itérations ?

Comment optimiser la réutilisation de PreparedStatement pour plusieurs itérations ?

DDD
DDDoriginal
2024-10-27 16:33:29603parcourir

 How to Optimize PreparedStatement Reusage for Multiple Iterations?

Réutilisation d'une instruction préparée avec plusieurs itérations

Dans les cas où une seule connexion commune est utilisée sans pool de connexions, vous pouvez rencontrer la question de savoir s'il est plus efficace de créer une nouvelle instance PreparedStatement pour chaque opération DML ou SQL tout en préservant les avantages des instructions préparées.

Au lieu de :

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

Vous pouvez envisager :

<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();

Bien que la deuxième approche offre un léger gain d'efficacité, une solution supérieure réside dans l'exécution par lots :

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

Cette approche tire parti des capacités de traitement par lots fournies par les pilotes JDBC, réduisant ainsi le nombre de allers-retours vers la base de données et augmentation de l’efficacité. Vous pouvez optimiser davantage en définissant une limite de taille de lot, par exemple en exécutant tous les 1 000 éléments :

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

En ce qui concerne les environnements multithread, vous pouvez garantir la sécurité des threads en acquérant et en fermant à la fois la connexion et l'instruction dans les plus brefs délais. portée possible à l'aide de l'instruction try-with-resources, comme démontré dans les extraits de code ci-dessus. Pour les lots transactionnels, désactivez la validation automatique et validez la transaction uniquement une fois tous les lots terminés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn