Nella lezione degli Entity Beans di tipo BMP abbiamo visto come questi componenti gestiscono la logica di collegamento al database in maniera tradizionale, cioè utilizzando JDBC e i driver relativi al database a cui bisogna connettersi.
La strategia adottata nel nostro semplice esempio è stata quella di creare un metodo dentro il quale cablare le informazioni di accesso (class driver e url). Di sicuro una cattiva implementazione per diversi motivi, primo fra tutti quello di manutenzione: il cambio di sorgente dati ci avrebbe coinvolti in una necessaria modifica delle informazioni, e quindi un nuovo deploy con tutte le conseguenze (interruzione di servizio, nuovi test, ...). Il forte accoppiamento è sempre una cattiva strategia di sviluppo.
La piattaforma J2EE presenta uno strumento molto utile che risolve il precedente e tanti altri problemi, legati proprio alle questioni di accesso alle sorgenti dati. L'idea è quella di disaccoppiare la sorgente dati e le classi JDBC utilizzate per la gestione delle query SQL (interfaccia Connection), affidando tale servizio all'application server.
Il concetto è noto come pool di connessioni o Datasource (dall'interfaccia java che lo rappresenterà in fase di sviluppo). Il ciclo di vita di questo nuovo oggetto sarà affidato all'application server, che gestirà le risorse operando su tale pool, garantendo le connessioni al database a chi ne farà richiesta.
L'operazione di creazione è un'operazione descrittiva, realizzata mediante la creazione di file XML oppure direttamente dalla console di amministrazione dell'application server. Noi mostreremo come creare il Datasource su JBoss per un database MySQL, ma concettualmente l'operazione di creazione è identica in ogni ambiente di esecuzione (cambieranno i nomi dei parametri).
Bisognerà creare un file XML (si costruisce a partire dagli esempi già proposti) ed inserirlo sotto la cartella di deploy.
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>SampleDatasource</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/sample_datasource</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>xxxxxx</password>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
Per prima cosa gli diamo un nome JNDI, che lo identificherà in maniera univoca. Dopo settiamo l'url e il driver JDBC concreto. Fondamentalmente sarebbero necessarie queste informazioni. In più possono essere aggiunte altre informazioni che aiutano l'application server nella gestione del pool.
A parte le credenziali di accesso potremo inserire il numero massimo di connessioni contemporanee, il numero minimo di connessioni da mantenere nel pool e quant'altro necessario ad ottimizzare il ciclo di vita del componente (per la modalità consultate la documentazione del vostro application server). Di sicuro in piccole applicazioni queste informazioni non saranno necessarie, ma, laddove gli accessi concorrenti sono tanti, calibrare bene questo tipo di informazioni è di vitale importanza alla funzionalità del sistema (i database possono rappresentare un collo di bottiglia).
Il client che avrà necessità di una connessione a quel database, a questo punto, dovrà semplicemente interrogare il servizio JNDI e recuperare una connessione dal pool.
..//
try {
Context context = new InitialContext();
javax.sql.DataSource ds =(javax.sql.DataSource)context.lookup("SampleDatasource");
Connection connection = ds.getConnection();
..//
connection.close();
}catch (Exception e) {
e.printStackTrace();
}
..//
Il sorgente ora potrebbe sostituire il corpo del metodo dell'entity BMP che si occupava di recuperare la connessione. Una futura modifica alla sorgente dati, comporterà la semplice modifica del descrittore del Datasource. Disaccoppiare, evidentemente, porta degli enormi benefici.