Indice

« Pillole di Tecnica

Tomcat: Pooling

Introduzione

Ho trovato una certa difficoltà a decifrare la documentazione ufficiale di Tomcat sull' argomento del pooling, perciò ho deciso di scrivere questa breve guida.

I passi fondamentali da eseguire sono pochi.

Configurazione

Per definire un pool di connessioni è necessario inserire un tag simile al seguente all' interno di META-INF/context.xml e del tag Context (il toplevel per quel file).

<Resource
name="jdbc/test"
auth="Container"
type="javax.sql.DataSource" 
username="username" 
password="password"
driverClassName="com.ddtek.jdbc.sequelink.SequeLinkDriver"
url="jdbc:sequelink://localhost:2399;serverDataSource=test"
removeAbandoned="true"
removeAbandonedTimeout="60"
/>

E' necessario che la classe driver nominata in driverClassName sia installata nella cartella lib/ext del runtime java e non all' interno dell' applicazione web o tra le librerie condivise di tomcat.

La ragione è che la classe deve essere presente prima dell' avvio di tomcat, altrimenti tomcat non riuscirà a caricarla. E' necessario anche riavviare tomcat dopo aver copiato il file .jar che contiene la classe driver in lib/ext.

Esempio JSTL

Dichiarare i tag JSTL:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

Specificando i dati della connessione direttamente nel tag sql:dataSoure il sistema crea una nuova connessione all' inizio di ogni pagina e la abbatte alla fine. Perciò impostiamo la sorgente dati per nome:

<sql:setDataSource dataSource="jdbc/test" />

In questo modo il pooling sarà attivo e potremo eseguire normalmente le query.

<sql:query var="result">
select * from test
</sql:query>
 
<c:forEach var="row" items="${result.rowsByIndex}">
${row[0]}<br>
</c:forEach>

Esempio JSP

Ottenere la connessione:

InitialContext ctx = new javax.naming.InitialContext();
DataSource dso = (javax.sql.DataSource)ctx.lookup("java:comp/env/jdbc/test");
Connection conn = dso.getConnection();

Importante! Chiudere le connessione esplicitamente prima della fine della pagina, altrimenti la connessione stessa rimarrà bloccata per 60 secondi e in certi casi sarà possibile bloccare l' intero pool.

conn.close();

Benefici

Prestazioni

E' davvero veloce. Alcuni database soffrono particolarmente di connessioni sconnessioni frequenti. FileMaker è uno di questi.

Problemi

Leaks

Le pagine scritte in JSTL non soffrono particolarmente di questo problema perché in qualche modo tomcat si ricorda si rilasciare le connessioni automaticamente. Purtroppo però nei frammenti JSP è necessario assicurarsi che le connessioni siano chiuse esplicitamente non appena il loro utilizzo non è più necessario.