Newsgroup: it.comp.java
Titolo: [Lungo] Tomcat + sqlserver: incubi e storie dell'orrore

Aiutatemi prima che finisca al manicomio... :-)
Sto cercando di connetermi a un db sqlserver attraverso il connection
pooling di tomcat e jndi. Ho gia' speso moltissime ore a leggermi documenti,
messaggi e articoli a riguardo e messaggi che non hanno risolto il mio
problema. Quando tento di recuperare la connessione dal codice del mio
servlet viene lanciata questa eccezione:
org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of
class '' for connect URL 'null'
<...snip...>
Caused by: java.sql.SQLException: No suitable driver
<...snip...>
Sembra essere un problema molto diffuso perche' ci sono centinaia di
richieste in merito, ma sembra che non ci sia una soluzione!
Nel server.xml di Tomcat (5.0.27 ed ho provato anche versioni 4)  ho
inserito questo:
   <Context path="/HelloWebModule"
    docBase="HelloWebModule"
    debug="1"
    reloadable="true" >
    <Resource name="jdbc/sqlserver" auth="Container"
type="javax.sql.DataSource" />
    <ResourceParams name="jdbc/sqlserver">
     <parameter>
      <name>maxWait</name>
      <value>5000</value>
     </parameter>
     <parameter>
      <name>maxActive</name>
      <value>4</value>
     </parameter>
     <parameter>
      <name>url</name>
<value>jdbc:jtds:sqlserver://localhost:1433;DatabaseName=TestJDBC;SelectMethod=cursor</value>
     </parameter>
     <parameter>
      <name>driverClassName</name>
      <value>net.sourceforge.jtds.jdbc.Driver</value>
     </parameter>
     <parameter>
      <name>maxIdle</name>
      <value>2</value>
     </parameter>
     <parameter>
      <name>username</name>
      <value>dbuser</value>
     </parameter>
     <parameter>
      <name>pwd</name>
      <value></value>
     </parameter>
     <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
     </parameter>
    </ResourceParams>
   </Context>
nel web.xml dell'applicazione ho messo questo:
  <resource-ref>
    <res-ref-name>jdbc/sqlserver</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
e il codice con cui cerco di ottenere la connessione e' questo:
     InitialContext jndiCntx = null;
     Context ctx = null;
       if (dataSource == null) {
         jndiCntx = new InitialContext();
         ctx = (Context) jndiCntx.lookup("java:comp/env");
         dataSource = (javax.sql.DataSource)
             ctx.lookup(jdbc/sqlserver);
       }
       dbConnection = dataSource.getConnection();
Ho provato a usare il driver Microsoft mettendo i rispettivi file .jar nella
common\lib di tomcat e nel classpath dell'applicazione. Non essendoci
riuscito ho anche provato con jtds ma non e' cambiato nulla...
Dove sbaglio? possibile che sia cosi' difficile??
merlinO

 <...snip...>
Che dire? Dovrebbe essere tutto in ordine.
L'unico dubbio che avrei č sul numero di jar che fanno parte del driver
jdbc.
Nella mia applicazione tali jar sono:
msbase.jar, mssqlserver.jar ed msutil.jar.
Io li ho messi nella cartella common lib di Tomcat.
Inoltre la definizione del mio contesto č la seguente:
<Context className="org.apache.catalina.core.StandardContext"
cachingAllowed="true"
   charsetMapperClass="org.apache.catalina.util.CharsetMapper"
cookies="true"
   crossContext="true" debug="0" docBase="D:\test"
   mapperClass="org.apache.catalina.core.StandardContextMapper"
path="/testmssql"
   privileged="false" reloadable="true" swallowOutput="false"
useNaming="true"
   wrapperClass="org.apache.catalina.core.StandardWrapper"
   workDir="D:\test\work">
  <Resource name="jdbc/dsnmssql" scope="Shareable"
type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/dsnmssql">
    <parameter>
      <name>validationQuery</name>
      <value>SELECT getdate()</value>
    </parameter>
    <parameter>
      <name>maxWait</name>
      <value>5000</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>10</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value>test</value>
    </parameter>
    <parameter>
      <name>url</name>
<value>jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=TEST</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>10</value>
    </parameter>
    <parameter>
      <name>username</name>
      <value>test</value>
    </parameter>
  </ResourceParams>
</Context>
Nel file web.xml non c'č nessun riferimento alla risorsa definita nel
contesto. Per cui proverei a commentare quelle righe.
La connessione viene acquisita in questo modo:
.....
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
ds = (DataSource)envContext.lookup("jdbc/dsnmssql");
Connection c = ds.getConnection();
.....
Ultima nota di "colore". Noi stiamo passando ad Oracle 10G; superato questo
problema
probabilmente ne avrai degli altri come il tristemente famoso (Connection
reset by peer ).
Buona fortuna.

 Buona fortuna.
merlinO