In questo documeto si spiega velocemente ed in italiano come ut

Ing. Danilo Spada
www.danilospada.it
UsaDataSource
In questo documento si spiega velocemente ed in italiano come utilizzare il
datasource di Tomcat per connettersi ad un RDBMS utilizzando una connection pool
interamente gestita dal container di Tomcat.
In pratica settando opportuni parametri (url, driver, username, password, numero
connessione attive, etc..) tramite interfaccia di amministrazione o anche editando a
mano un file xml, è possibile utilizzare all’interno di servlet e jsp le connessioni di un
pool acquisendo il datasource direttamente tramite JNDI.
Il meccanismo del connection pool, come noto, aumenta molto le prestazioni delle
applicazioni in quanto l’operazione più onerosa in termini di tempo quando si
interagisce con un db è lo stabilimento della connessione. Stabilendo un numero
ragionevole di connessioni all’avvio dell’applicazione ed usandole quando
necessario, si evita di doverne aprire una nuova ogni volta. Naturalmente il db con
cui si sta lavorando deve supportare le connessioni multiple.
Usare il datasource di Tomcat per connettersi ad un RDBMS influisce molto sulle
prestazioni e semplifica l’utilizzo delle connessioni (acquisizione e rilascio)
all’interno delle applicazioni. Rientra inoltre nelle linee guida di sviluppo delle
applicazioni con tecnologie servlet e jsp; queste infatti raccomandano il trasferimento
ai moduli connector della responsabilità di interazione con moduli esterni al
container.
Creare un nuovo datasource Step by Step
Accedendo all’interfaccia di amministrazione di Tomcat
(http://localhost:8080/admin/), aprendo:
Service (Catalina)
Host (localhost)
Context (/NomeContesto)
Resources
Data Sources
Ing. Danilo Spada
www.danilospada.it
Selezionando: Create new Data Source, si visualizza la seguente
schermata:
Ing. Danilo Spada
www.danilospada.it
Per chi ha familiarità con l’utilizzo delle librerie JDBC, risulterà molto
semplice la valorizzazione dei campi indicati:
1. Il JNDI Name è il nome con cui chiameremo la risorsa all’interno delle servlet
mediante l’istruzione:
javax.sql.DataSource ds= (javax.sql.DataSource)new
javax.naming.InitialContext().lookup("java:comp/env/jdbc/impiegato");
N.B.
Per usare questa funzione bisogna importare il package javax.naming;
2. Il Data Source Url è l’url di connessione al DataBase;
3. Il JDBC Driver Class è il driver di connessione al DataBase;
4. Username e password sono quelli di connessione al DataBase;
5. Max Active Connections è il massimo numero di connessioni gestite dal pool
(e quindi il massimo numero di connessioni aperte contemporaneamente al db);
6. Max Idle Connections è il minimo numero di connessioni tenute aperte dal
pool (e quindi il minimo numero di connessioni aperte contemporaneamente al
db);
7. Max Wait for Connection è il tempo massimo in millisecondi che il datasource
fa aspettare prima di notificare che non ci sono connessioni disponibili, per chi
ne richiede una, quando sono tutte occupate;
Una volta valorizzati opportunamente questi parametri si deve salvare e quindi
committare i cambiamenti (tasto commit changes). Il risultato di tale operazione è la
modifica del file xml che ha lo stesso nome dell’applicazione ed è contenuto in:
C:\jakarta-tomcat\conf\Catalina\localhost
Come esempio si veda il file UsaDataSource.xml. Tale file in effetti può essere
editato anche a mano senza usare l’interfaccia descritta, il risultato finale è lo stesso
anche se l’operazione è un po’ meno user-friedly!!
Un altro modo possibile per configurare il datasource è farlo all’interno del file server.xml. I
parametri sono gli stessi ed in pratica (si può fare una prova) basta inserire la porzione di codice
contenuta dentro il file xml del punto precedente appena prima del tag </HOST> (si veda per es il
Ing. Danilo Spada
www.danilospada.it
file _server.xml). In questo caso più applicazioni possono usare lo stesso datasource, tuttavia
bisogna editare anche i vari web.xml come mostrato in _web.xml per abilitare l’applicazione all’uso
di tale risorsa.
Fatto questo, all’interno di ogni servlet possiamo usare le connections
del pool così:
import ….*;
import javax.naming.*;
public class MiaServlet extends HttpServlet{
public void doPost(HttpServletRequest req, HttpServletResponse res) throws
ServletException, IOException {
try{
javax.sql.DataSource ds= (javax.sql.DataSource)new
javax.naming.InitialContext().lookup("java:comp/env/jdbc/impieg
ato");
Connection conn=ds.getConnection();
//uso la conn
//uso la conn
//uso la conn
conn.commit(); //committo le modifiche fatte
}
catch (Exception e)
{
log(e.getMessage());
}
finally {
try{
if (conn =! null)
conn.close(); //rendo la conn al pool
}
catch (SQLException e)
{
log(e.getMessage());
}
}
}
Ing. Danilo Spada
www.danilospada.it
Come si vede, una volta configurato il datasource, all’interno delle servlet è molto
semplice utilizzare le connessioni del pool.
Vantaggi
Il vantaggio di utilizzare questa tecnica rispetto ad utilizzare una classe connection
pool è che quest’ultima andrebbe gestita all’interno dell’applicazione (dovrebbe
essere istanziata, magari usando dei parametri memorizzati all’interno del deploy
descriptor, dovrebbe essere messa in sessione o a livello di contesto, magari
condivisa tra più chiamate alla stessa servlet o tra più servlet e così via..); d’altro
canto usando una classe ad hoc (e gestita ad hoc) il meccanismo potrebbe essere
sicuramente customizzato in maniera più appropriata. Come al solito bisognerà fare
un bilancio tra la comodità e le possibili ottimizzazioni, anche in base al tempo e alle
risorse umane disponibili.
Un altro vantaggio è che usando il datasource si possono riconfigurare i parametri
direttamente dall’interfaccia di amministrazione senza dover effettuare il reload o
l’arresto dell’applicazione. Questo in fase di tuning dell’applicazione può risultare
molto comodo.