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.