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

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

DDD
Libérer: 2024-10-27 16:33:29
original
720 Les gens l'ont consulté

 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();
}
Copier après la connexion

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();
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal