JDBC import java sql Connection con Driver Manager
JDBC
import java. sql. *; Connection con = Driver. Manager. get. Connection( "odbc: jdbc: my. DB", db. Username, db. Pswd); con. close();
Eseguire una query String query = "SELECT * FROM USERS"; Statement stmt = con. create. Statement(); Result. Set rs = stmt. execute. Query(query); while (rs. next()) { String s = rs. get. String("Username"); int n = rs. get. Int("Age"); System. out. println(s + " " + n); } rs. close(); stmt. close();
rs. next() sempre… query="SELECT count(*) AS C" + "FROM USERS"; rs=stmt. execute. Query(query); if (rs. next()) int m = rs. get. Int("C"); else System. out. println(“ahhhhhhh”); }
Ogni operazione sui dati va incluso in un blocco try catch per gestire eventuali eccezioni try { … } catch(SQLException se) { //fai qualcosa } catch(Exception e) { //fai qualcos’altro }
Eseguire un update Statement stmt = con. create. Statement(); stmt. execute. Update( "INSERT INTO USERS " + "VALUES ("Alex", "12345", 42)"); … stmt. close();
Transazioni in JDBC • Scelta della modalità delle transazioni: un metodo definito nell'interfaccia Connection: set. Auto. Commit(boolean auto. Commit) • con. set. Auto. Commit(true) – (default) "autocommit": ogni operazione è una transazione • con. set. Auto. Commit(false) – gestione delle transazioni da programma con. commit() con. rollback() – non c'è start transaction 7
Transazioni in JDBC try { con. set. Auto. Commit(false); Statement st=con. create. Statement(); st. execute. Update(“…”); … con. commit(); } catch (Exception ex) { try { con. rollback(); } catch (SQLException sqx) }
CONNECTION POOL import java. sql. *; public class My. Connection. Pool { // array di connessioni al database Connection con[]; // array delle disponibilità delle connessioni boolean busy[]; // registra chi sta tenendo occupata la connessione String who[]; // numero di connessioni attive int num. Con; // incremento dimensione del pool per accogliere nuove richieste int inc;
// parametri di accesso al database String db. Url; String db. Username; String db. Pswd; String driver. String; /** Costruttore */ public My. Connection. Pool ( String db. Url, String db. Username, String db. Pswd, int num. Con, int inc, String driver. String ) throws Exception { this. db. Url = db. Url; this. db. Username = db. Username; this. db. Pswd = db. Pswd; this. num. Con = num. Con; this. inc = inc; this. driver. String = driver. String; new. Connections(); }
/** * new. Connections */ private synchronized void new. Connections() throws Exception { // alloca gli array globali (connessioni e info) con = new Connection[num. Con]; busy = new boolean[num. Con]; who = new String[num. Con]; Class. for. Name(driver. String); for (int i = 0; i < num. Con; i++) { con[i] = Driver. Manager. get. Connection(db. Url, db. Username, db. Pswd); busy[i] = false; who[i] = ""; } }
/** * extend. Connections */ public synchronized void extend. Connections() throws Exception { // copia dei vecchi vettori Connection con 2[] = con; boolean busy 2[] = busy; String who 2[] = who; // creazione dei nuovi vettori estesi con = new Connection[num. Con+inc]; busy = new boolean[num. Con+inc]; who = new String[num. Con+inc];
//ciclo per trasferire le vecchie connessioni nei nuovi array for (int i = 0; i < num. Con; i++) { con[i] = con 2[i]; busy[i] = busy 2[i]; who[i] = who 2[i]; } //ciclo per creare le nuove connessioni da aggiungere alle precedenti for (int i = num. Con; i < num. Con+inc; i++) { con[i] = Driver. Manager. get. Connection(db. Url, db. Username, db. Pswd); busy[i] = false; who[i] = ""; } num. Con += inc; }
/** get. Connection - assegna una connessione all’utente who */ public synchronized Connection get. Connection(String who) throws Exception { int ind. Free = find. Free. Connection(); if (ind. Free < 0) { // se arriva qui, il pool è saturo: lo estende e // richiama ancora find. Free. Conn…() extend. Connections(); ind. Free = find. Free. Connection(); if( ind. Free < 0 ) return null; // se arriva qui non ci sono proprio più risorse } // salvo catastrofi verrà sempre eseguito questo codice busy[ind. Free] = true; who[ind. Free] = who; return con[ind. Free]; }
/** get. Connection */ public synchronized Connection get. Connection() throws Exception { return get. Connection(“no. Name”); } /** * release. Connection - la connessione viene solo “liberata” */ public synchronized void release. Connection(Connection c) { for (int i = 0; i < num. Con; i++) { if (con[i] == c) { who[i] = ""; busy[i] = false; } } }
/** find. Free. Connection - scandisce il vettore e restituisce l’indice */ protected int find. Free. Connection() { for(int i = 0; i < num. Con; i++) if ( ! busy[i] ) return i; return -1; } /** print. Status. Connection */ public String print. Status. Connection() { String result = ""; for (int i = 0; i < num. Con; i++) result += "Conn. " + i + ": " + busy[i] + " used by: " + who[i]; return result; } } // chiude la classe
- Slides: 16