La deuxième manière est un peu plus efficace, mais d'une bien meilleure façon est de les exécuter en lots:
PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < 1000; i++) {
preparedStatement.setObject(1, someValue);
preparedStatement.addBatch();
}
preparedStatement.executeBatch();
preparedStatement.close(); // Do this in the finally block!
Vous êtes cependant dépendante sur le pilote JDBC de mise en œuvre de la façon dont de nombreux lots vous pouvez exécuter à la fois. Vous pouvez par exemple vous souhaitez exécuter tous les 100 lots:
PreparedStatement preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < 1000; i++) {
preparedStatement.setObject(1, someValue);
preparedStatement.addBatch();
if ((i + 1) % 100 == 0) {
preparedStatement.executeBatch();
}
}
preparedStatement.executeBatch();
preparedStatement.close(); // Do this in the finally block!
Comme pour le multithread environnements, vous n'avez pas besoin de s'inquiéter à ce sujet si vous acquérir et de fermer la connexion et l'état le plus rapidement possible la portée à l'intérieur de la même méthode de bloc selon la normale JDBC idiome. Voici un exemple de base:
public void executeBatch(/* ... */) throws SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = database.getConnection();
preparedStatement = connection.prepareStatement(SQL);
// ...
} finally {
close(preparedStatement);
close(connection);
}
}
Mise à jour: selon les commentaires, en fonction de l'exigence fonctionnelle, vous auriez souvent, en effet, comme pour n'engagent que la transaction lorsque tous les lots sont finis, sinon il peut être imprévisible, qui sont celles de l'lots sont déjà insérées/mis à jour et qui n'est pas. La DB serait se salir ensuite. Voici comment vous pouvez le faire:
public void executeBatch(/* ... */) throws SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = database.getConnection();
connection.setAutoCommit(false);
preparedStatement = connection.prepareStatement(SQL);
// ...
connection.commit();
} catch (SQLException e) {
connection.rollback();
throw e;
} finally {
close(preparedStatement);
close(connection);
}
}