domenica 13 maggio 2012

Definire Data Source su Tomcat 4.1

Con Tomcat 4 non è possibile definire i datasource nel file context.xml (dentro la META-INF del war); o quantomeno così facendo sono incappato in errori del tipo "Cannot create JDBC driver of class '' for connect URL 'null'" (in molti hanno avuto questi problemi).
Seguendo il tutorial presente sul sito sono riuscito a definire un datasource specifico per una web application.
I passi da seguire sono:
  1. Scaricare il driver per la connessione JDBC e posizionarlo nella directory commons/lib dell'AS;
  2. Modificare il file conf/server.xml definendo il contesto dell'applicazione e il datasource;
  3. Inserire all'interno del web.xml della web application il nodo <resource-ref> (altrimenti si incappa in errori del tipo "JDBC not bound").
 Vediamo in dettaglio i passi 2 e 3 e poi un esempio di chiamata da una servlet per recuperare la connection.
Il db di test è Mysql

Punto 2

All'interno del conf/server.xml, dopo la chiusura dell'ultimo nodo </Context>  e prima della chiusura del nodo </Host>, inserire il seguente xml (NOTA : TestDs è il nome della nostra Web App mentre jdbc/TestDB è il nome del datasource):

<Context path="/TestDs" docBase="TestDs"
        debug="5" reloadable="true" crossContext="true">

  <Logger className="org.apache.catalina.logger.FileLogger"
             prefix="localhost_DBTest_log." suffix=".txt"
             timestamp="true"/>

  <Resource name="jdbc/TestDB"
               auth="Container"
               type="javax.sql.DataSource"/>

  <ResourceParams name="jdbc/TestDB">
    <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    </parameter>

    <!-- Maximum number of dB connections in pool. Make sure you
         configure your mysqld max_connections large enough to handle
         all of your db connections. Set to -1 for no limit.
         -->
    <parameter>
      <name>maxActive</name>
      <value>100</value>
    </parameter>

    <!-- Maximum number of idle dB connections to retain in pool.
         Set to 0 for no limit.
         -->
    <parameter>
      <name>maxIdle</name>
      <value>30</value>
    </parameter>

    <!-- Maximum time to wait for a dB connection to become available
         in ms, in this example 10 seconds. An Exception is thrown if
         this timeout is exceeded.  Set to -1 to wait indefinitely.
         -->
    <parameter>
      <name>maxWait</name>
      <value>10000</value>
    </parameter>

    <!-- MySQL dB username and password for dB connections  -->
    <parameter>
     <name>username</name>
     <value>root</value>
    </parameter>
    <parameter>
     <name>password</name>
     <value>root</value>
    </parameter>

    <!-- Class name for mm.mysql JDBC driver -->
    <parameter>
       <name>driverClassName</name>
       <value>org.gjt.mm.mysql.Driver</value>
    </parameter>

    <!-- The JDBC connection url for connecting to your MySQL dB.
         -->
    <parameter>
      <name>url</name>
      <value>jdbc:mysql://localhost:3306/world</value>
    </parameter>
  </ResourceParams>
</Context>

Punto 3

Nel web.xml inserire:

 <resource-ref>
    <description>nome jndi del ds</description>
    <res-ref-name>jdbc/TestDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

Per richiamare il datasource dall'applicazione è sufficiente inserire il seguente codice:

 Context context = new InitialContext();
javax.sql.DataSource ds =(javax.sql.DataSource)context.lookup("java:comp/env/jdbc/TestDB");
 Connection connection = ds.getConnection();

NOTA: Con Tomcat 6 e 7 è possibile inserire una notazione più compatta del ds con una serie di attributi che specificano i vari username password url etc. , ho provato anche con tomcat 4.1 ma non mi ha funzionato per cui deduco che non sia possibile

Nessun commento:

Posta un commento