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