Batch processing
2025 – prof. Roberto Fuligni
Il batch processing in JDBC è una tecnica che consente di eseguire più operazioni SQL in un’unica richiesta al database, invece di eseguire ogni operazione singolarmente. Questo approccio migliora notevolmente le prestazioni, riducendo lo scambio di dati tra l’applicazione e il database e ottimizzando l’elaborazione delle query.
Il batch processing permette di inviare a un database più istruzioni SQL in blocco, sfruttando l’oggetto Statement
o PreparedStatement
. Viene utilizzato soprattutto quando si devono eseguire molte operazioni di inserimento, aggiornamento o eliminazione.
Quando si devono inserire molti record simili, PreparedStatement
è più efficiente e sicuro, poiché evita SQL injection e migliora le prestazioni grazie alla compilazione e caching della query.
final double saldoIniziale = 1000.00;
try (Connection conn = DriverManager.getConnection(url, user, pwd)) {
conn.setAutoCommit(false);
try (Statement stmt = conn.createStatement()) {
stmt.addBatch("INSERT INTO conti (nome, saldo) VALUES ('Paolo Rossi', " + saldoIniziale + ")");
stmt.addBatch("INSERT INTO conti (nome, saldo) VALUES ('Anna Bianchi', " + saldoIniziale + ")");
stmt.addBatch("INSERT INTO conti (nome, saldo) VALUES ('Giuseppe Verdi', " + saldoIniziale + ")");
stmt.addBatch("INSERT INTO conti (nome, saldo) VALUES ('Francesca Romano', " + saldoIniziale + ")");
stmt.addBatch("INSERT INTO conti (nome, saldo) VALUES ('Paolo Esposito', " + saldoIniziale + ")");
stmt.addBatch("INSERT INTO conti (nome, saldo) VALUES ('Laura Ferrari', " + saldoIniziale + ")");
stmt.addBatch("INSERT INTO conti (nome, saldo) VALUES ('Antonio Russo', " + saldoIniziale + ")");
stmt.addBatch("INSERT INTO conti (nome, saldo) VALUES ('Sofia Marino', " + saldoIniziale + ")");
stmt.addBatch("INSERT INTO conti (nome, saldo) VALUES ('Marco Greco', " + saldoIniziale + ")");
stmt.addBatch("INSERT INTO conti (nome, saldo) VALUES ('Giulia Costa', " + saldoIniziale + ")");
int[] risultati = stmt.executeBatch();
for (int risultato : risultati) {
if (risultato == 0) {
throw new SQLException("Inserimento incompleto");
}
}
conn.commit();
System.out.println("Batch eseguito con successo!");
} catch (SQLException e) {
conn.rollback();
System.err.println("Errore durante l'inserimento batch: " + e.getMessage());
}
} catch (SQLException e) {
System.err.println("Errore di connessione al database: " + e.getMessage());
}
List<String> nomi = List.of("Paolo Rossi", "Anna Bianchi", "Giuseppe Verdi",
"Francesca Romano", "Paolo Esposito", "Laura Ferrari", "Antonio Russo",
"Sofia Marino", "Marco Greco", "Giulia Costa");
final double saldoIniziale = 1000.00;
final String sqlInserimento = "INSERT INTO conti (nome, saldo) VALUES (?, ?)";
try (Connection conn = DriverManager.getConnection(url, user, pwd)) {
conn.setAutoCommit(false);
try (PreparedStatement ps = conn.prepareStatement(sqlInserimento)) {
for (String nome : nomi) {
ps.setString(1, nome);
ps.setDouble(2, saldoIniziale);
ps.addBatch();
}
int[] risultati = ps.executeBatch();
for (int risultato : risultati) {
if (risultato == 0) {
throw new SQLException("Inserimento incompleto");
}
}
conn.commit();
} catch (SQLException e) {
conn.rollback();
System.err.println("Errore durante l'inserimento batch: " + e.getMessage());
}
} catch (SQLException e) {
System.err.println("Errore di connessione al database: " + e.getMessage());
}