Gestione dei Pool di Connessioni (Parte II)
Pagina 2 di 2
Sviluppo passo passo di una classe ConnectionPool inJava
Procediamo con lo sviluppo di codice Java in grado di gestirecorrettamente un pool di connessioni.
Costruiamo innanzitutto una classe ConnectionPoolException,le cui istanze sono le eccezioni che verranno sollevatequando si dovesse presentare un errore a runtime nella classeConnectionPool.
1.
// Classe che gestisce le eccezioni sollevate a runtime dalla// classe ConnectionPoolpublic class ConnectionPoolException extends Exception { public ConnectionPoolException() { }}
Ricordiamo che al pool di connessioni dovranno accedereprocessi distinti. E' necessatio quindi trovare unartificio per far si che tutti i processi accedano ad unicaistanza della classe ConnectionPool.
L'idea è quella di avere una variabile staticaconnectionPool all'interno della classe ConnectionPool.Un metodo statico, getConnectionPool, permetterà diaccedere a questa variabile da parte dei processi che nefanno richiesta. Se la variabile non è stata ancoraistanziata il metodo getConnectionPool provvederà allasua istanziazione.
Dal momento che più processi accedono agetConnectionPool in concorrenza, definiamo il metodo comesynchronized.
1.
...
// La classe che gestisce un pool di connessionipublic class ConnectionPool {...// La variabile che gestisce l'unica istanza di ConnectionPoolprivate static ConnectionPool connectionPool = null;...public static synchronized ConnectionPool getConnectionPool() throws ConnectionPoolException { if(connectionPool == null) { connectionPool = new ConnectionPool(); } return connectionPool;}...}
Il codice di getConnectionPool accede al costruttore dellaclasse per creare l'unica istanza di ConnectionPool.Questo si preoccupa di creare la coda per le connessionilibere, caricare i parametri per l'accesso al databaseaccedendo al metodo loadParameters e caricare il driver dellabase di dati con il metodo loadDriver.
Osserviamo che il costruttore è privato. In questomodo garantiamo che l'accesso ad esso avvenga solotramite la funzione pubblica getConnectionPool.
1.
import
java.util.*;...
// La classe che gestisce un pool di connessionipublic class ConnectionPool {...private Vector freeConnections; // La coda di connessioni libereprivate String dbUrl; // Il nome del databaseprivate String dbDriver; // Il driver del databaseprivate String dbLogin; // Il login per il databaseprivate String dbPassword;// La password di accesso al database...// Costruttore della classe ConnectionPoolprivate ConnectionPool() throws ConnectionPoolException { // Costruisce la coda delle connessioni libere freeConnections = new Vector(); // Carica I parametric per l'accesso alla base di dati loadParameters(); // Carica il driver del database loadDriver();}// Funzione privata che carica i parametri per l'accesso al databaseprivate loadParameters() { // Url per un database locale dbUrl = "jdbc:mysql://localhost/prova"; // Driver per database mysql dbDriver = "org.gjt.mm.mysql.Driver"; // Login della base di dati dbLogin = "Login"; // Password per l'accesso al database dbPassword = "Password";}// Funzione privata che carica il driver per l'accesso al database.// In caso di errore durante il caricamento del driver solleva un'eccezione.private loadDriver() throws ConnectionPoolException { try { java.lang.Class.forName(dbDriver + "?user=" +dbUser + "&password=" + dbPassword); } catch (Exception e) { throw new ConnectionPoolException(); }}...}
Analizziamo la funzione getConnection che restituisce unaconnessione libera. getConnection verifica innanzitutto checi siano elementi nella coda delle connessioni libere. Se lacoda non è vuota, preleva la prima connessione everifica che sia valida. Se la connessione non èpiù valida effettua una chiamata ricorsiva perprelevare l'elemento successivo.
Se la coda e' vuota, getConnection chiama newConnectionper stabilire una nuova connessione. Il metodo getConnectionè di tipo synchronized perché può essererichiamato da più processi concorrenti.
Il metodo newConnection non deve necessariamente esseresynchronized perché viene richiamato da getConnectionche già opera in mutua esclusione.
1.
import
java.sql.*;...
// Il metodo getConnection restituisce una connessione libera prelevandola// dalla coda freeConnections oppure se non ci sono connessioni disponibili// creandone una nuova con una chiamata a newConnectionpublic synchronized Connection getConnection()throws ConnectionPoolException { Connection con; if(freeConnections.size() > 0) { // Se la coda delle connessioni libere non è vuota // preleva il primo elemento e lo rimuove dalla coda con = (Connection) freeConnections.firstElement(); freeConnections.removeElementAt(0); try {// Verifica se la connessione non è più validaif(con.isClosed()) { // Richiama getConnection ricorsivamente con = getConnection();} } catch(SQLException e) {// Se c'è un errore richiama GetConnection// ricorsivamentecon = getConnection(); } } else { // se la coda delle connessioni libere è vuota // crea una nuova connessione con = newConnection(); } // restituisce la connessione return con;}// Il metodo newConnection restituisce una nuova connessioneprivate Connection newConnection() throws ConnectionPoolException { Connection con = null; try { // crea la connessione con = DriverManager.getConnection(dbUrl); } catch(SQLException e) { // in caso di errore solleva un'eccezione throw new ConnectionPoolException(); } // restituisce la nuova connessione return con;}...
Una volta terminato l'uso della connessione si chiama ilmetodo releaseConnection per ritornare la connessione nonpiù utilizzata nella coda.
Questo metodo come getConnection opera in regime diconcorrenza e deve quindi essere synchronized.
1.
...
// Il metodo releaseConnection rilascia una connessione inserendola// nella coda delle connessioni liberepublic synchronized void releaseConnection(Connection con) { // Inserisce la connessione nella coda freeConnections.add(con);}..
Il codice completo
Potete scaricare il codice completo da qui.
Riferimenti
Accesso ai database da java:
Java database e programmazione client/server - GiuseppeNaccarato - Apogeo
Java 2 Tecniche avanzate - Cay S. Horstmann e Gary Cornwell- McGraw Hill
Tecniche per gestire eccezioni e per la programmazioneconcorrente:
Java la guida completa - Patrick Naughton e Herbert Schildt- Mc Graw Hill
Core Java - Gary Cornell e Cay S. Horstmann - SunsoftPress
Java Fondamenti di programmazione - Deitel & Deitel -Apogeo
Sviluppo di siti web dinamici tramite servlet:
Java Servlet Programmino - Jason Hunter e Williiam Crawford- O'Reilly
Accesso a database MySql da codice Java:
JSP Servlet e MySql - David Harms - McGraw Hill