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

Continue reading JDBC, perché usare PreparedStatement invece di Statement

JDBC, chiudere le connessioni in modo sicuro

Spesso su internet si trovano molti esempi che servono, a chi sta iniziando, ad iniziare ad approcciare le connessioni JDBC. Purtroppo però questi esempi basilari partono sempre dalla forma errata, ovvero senza alcuna gestione delle eccezioni col risultato che il malcapitato database di turno si può trovare dozzine di connessioni appese mentre il novello programmatore fa i suoi test con applicazioni rudimentali.

Normalmente il codice si trova grosso modo così, in questo caso ad esempio con una sessione oracle:

import java.sql.*;
public class JDBCDemo {
    public static void main(String[] args) {
        try {
            // Connect to the database
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            conn = DriverManager.getConnection("jdbc:oracle:thin:@oraserver:1521:XE", "orauser", "orapwd");
            // Execute the SQL statement
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * from oratable");
            System.out.println("Got results!");
            // Loop thru all the rows
            while (rs.next()) {
                String data = rs.getString("some_field");
                System.out.println(data);
            }
            stmt.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}

Continue reading JDBC, chiudere le connessioni in modo sicuro