JDBC, perché usare PreparedStatement invece di Statement

Nel precedente articolo in tema JDBC ho usato java.sql.Statement, sarebbe buona cosa iniziare da subito ad usare java.sql.PreparedStatement, vediamo il perché. Normalmente quando arriva un SQL statement ad un db si scatena la seguente elaborazione:

  • Parsing della query
  • Compilazione della query
  • Generazione del plan ottimizzante il percorso di acquisizione dati
  • Esecuzione della query

Nel caso di java.sql.Statement i quattro passi vengono eseguiti ogni volta all’interno del motore del database, invece con java.sql.PreparedStatement i primi tre step sono pre-eseguiti ancora prima di arrivare al database, minimizzando il carico su quest’ultimo. Nel caso di insert e update massive, o molto frequenti, fornisce anche la possibilità di parametrizzare alcuni campi con le variabili di tipo bind, purtroppo molti programmatori si limitano a guardare il database come un semplice applicativo, senza valutare attentamente l’impatto delle proprie query. Ad esempio, suppiamo di dover fare tre insert del tipo:

Statement stmt;
    ...
    conn.setAutoCommit(false);
    stmt.addBatch("insert into (employees id.nextval, 'Homer')";
    stmt.addBatch("insert into (employees id.nextval, 'Lenny')";
    stmt.addBatch("insert into (employees id.nextval, 'Carl')";
    stmt.executeBatch();
    conn.commit();
    ...

Ora invece usiamo PreparedStatement, come si dovrebbe:

PreparedStatement stmt;
String query = "insert into employees id.nextval, ?";
    ...
    conn.setAutoCommit(false);
    stmt = conn.prepareStatement(query);
    stmt.setString(1,"Homer");
    stmt.addBatch();
    stmt.setString(1,"Lenny");
    stmt.addBatch();
    stmt.setString(1,"Carl");
    stmt.addBatch();
    stmt.executeBatch();
    conn.commit();
    ...

La scrittura del codice può sembrare più laboriosa ma lavorando opportunamente con i costrutti for e strutture dati opportune si può velocizzare molto il lavoro, si potrebbe ad esempio caricare i tre nomi in un array e ciclare con un for … addBatch().
Altra buona cosa da iniziare ad usare sin da subito è appunto batch execution con autoCommit disabilitato, in questo modo tutta la serie di insert avviene in una singola operazione atomica e, nel caso di errori, si può gestire il commit o meno.

Per ulteriori dettagli si può visitare questa pagina.

Leave a Reply

Your email address will not be published. Required fields are marked *