Help - Search - Member List - Calendar
Full Version: Pb Tomcat : Cannot Create Jdbc Driver Of Class
OpenSpace > Zone Ordinateurs > Programmation
Ryle
Ceci est un problème classique, répertorié dans de nombreux sites Web, cependant nulle part je n'ai pu trouver de réponse précise et qui m'eût été d'une quelconque utilité. Donc je m'adresse à vous pour résoudre ce problème très chiant qui m'occupe depuis ce matin :
J'ai un serveur Tomcat 5.0.28
J'ai un projet du nom de toto configuré dessus et je voudrais utiliser une JNDI pour me connecter à une base.

Mon fichier toto.xml (dans conf/catalina/localhost) :
CODE
<?xml version='1.0' encoding='utf-8'?>
<Context workDir="D:\Webapps\toto\work" path="/toto" reloadable="true"  displayName="Toto" docBase="D:\Webapps\toto">
<ResourceParams name="jdbc/sourcetoto">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>

<parameter><name>user</name><value>logintoto</value></parameter>
<parameter><name>password</name><value>pwdtoto</value></parameter>
<parameter><name>driverClassName</name>
 <value>oracle.jdbc.pool.OracleDataSource</value></parameter>
<parameter><name>url</name>
 <value>jdbc:oracle:thin:@machinetoto:1521:sidtoto</value></parameter>
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>5</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>


</ResourceParams>

</Context>


Mon fichier web.xml dans WEB-INF :
CODE
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Toto</display-name>
<description>Application de gestion de Toto</description>
<session-config>
 <session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
 <welcome-file>JSP/index.jsp</welcome-file>
</welcome-file-list>
<resource-ref>
 <res-ref-name>jdbc/sourcetoto</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>


</web-app>

ET chaque fois que j'exécute le code :
CODE

<%
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
%>
Contexte JNDI : <%=ctx%><br>
<% javax.sql.DataSource ds =
 (javax.sql.DataSource)ctx.lookup("java:comp/env/jdbc/sourcetoto"); %>

DataSource : <%=ds%><br>
<%
java.sql.Connection connection = ds.getConnection();
%>

la ligne java.sql.Connection connection = ds.getConnection(); me claque l'erreur :
CODE
org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'oracle.jdbc.pool.OracleDataSource' for connect URL 'jdbc:oracle:thin:@machinetoto:1521:sidtoto'


Si je fais une connexion JDBC sdirecte avec la chaîne jdbc:oracle:thin:@machinetoto:1521:sidtoto, ça marche impecc.
Quelqu'un connaît il la solution à ce problème qui à mon avis est très classique...

Autre chose : J'ai bien mis dans common/lib les fichiers classes12.jar et nls_charsets12.jar

Merci beaucoup
PoP
CODE

<% javax.sql.DataSource ds =
(javax.sql.DataSource)ctx.lookup("java:comp/env/jdbc/sourcetoto"); %>


Ca c'est pas bon.
Essaye plutôt
CODE

<% javax.sql.DataSource ds =
(javax.sql.DataSource)ctx.lookup("jdbc/sourcetoto"); %>
Ryle
Ok merci je teste ça lundi.
Ryle
J'obtiens ça :
CODE
Erreur : javax.naming.NameNotFoundException: Le Nom jdbc n'est pas lié à ce Contexte

Je cherche, si je trouve je poste la soluce .
Merci quand même Pop.

En fait j'ai remarqué qu'en voulant juste récupérer l'objet de nom java:comp/env/jdbc/sourcetoto à partir du JNDI, il récupère un objet null.
C'est donc que quelque part mon objet n'est pas initialisé. Il est déclaré mais pas initialisé.

J'ai modifié mon fichier toto.xml :
J'ai remplacé :
CODE
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>

Par :
CODE
<parameter>
     <name>factory</name>
     <value>oracle.jdbc.pool.OracleDataSourceFactory</value>
   </parameter>

et dans web.xml :
J'ai remplacé :
CODE
<resource-ref>
<res-ref-name>jdbc/sourcetoto</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

Par :
CODE
<resource-ref>
 <res-ref-name>jdbc/sourcetoto</res-ref-name>
 <res-type>oracle.jdbc.pool.OracleDataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

Ca ne fonctionne toujours pas.

Quand je passe un script qui m'affiche toutes le ressources JNDi, j'ai notamment ça :
QUOTE
java:comp/env/jdbc
sourcetoto
all                                  java.util.Vector$1@1bbdd48
factoryClassName           org.apache.naming.factory.ResourceFactory
className                      javax.sql.DataSource
factoryClassLocation        null
class                               class org.apache.naming.ResourceRef

Pourquoi ne prend il pas en compte les paramètres de mes fichiers XML ?
Je vais essayer en utilisant les noms générés par ce tableau > Ca ne change rien .
J'ai l'impression qu'il se fout de mes paramètres dans les fichiers XML.
Ryle
J'ai réussi à faire fonctionner mon appli.

Mon fichier toto.xml :
CODE

 <Resource type="javax.sql.DataSource" auth="Container" name="jdbc/sourcetoto"/>
 <ResourceParams name="jdbc/sourcetoto">
 <parameter>
   <name>factory</name>
   <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
 </parameter>
 <parameter>
   <name>driverClassName</name>
   <value>oracle.jdbc.driver.OracleDriver</value>
 </parameter>
 <parameter>
   <name>url</name>
   <value>jdbc:oracle:thin:@machine:port:sid</value>
 </parameter>
 <parameter>
   <name>username</name>
   <value>toto</value>
 </parameter>
 <parameter>
   <name>password</name>
   <value>titi</value>
 </parameter>
 <parameter>
   <name>maxActive</name>
   <value>20</value>
 </parameter>
 <parameter>
   <name>maxIdle</name>
   <value>10</value>
 </parameter>
 <parameter>
   <name>maxWait</name>
   <value>-1</value>
 </parameter>
 </ResourceParams>


Mon fichier web.xml :
CODE

<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/sourcetoto</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>


J'accède à ma connexion ainsi :

CODE
Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/sourcetoto");
Connection conn = ds.getConnection();


Apparemment une des raisons du fonctionnement serait que le paramètre user ne fonctionne pas mais qu'il faut utiliser username.
fadjer
Hello !

J'ai eu recement un problème chian !!! qui ressemble au tien !!! j'ai eu cette exception qui a failli me perdre la tête :
javax.naming.NameNotFoundException: Le Nom java:comp n'est pas lié à ce Contexte
Alors après des heures d'ivestigations et de creusage !! j'ai découvert que le problème venait d'un attribut de l'entrée "<Context ...>" dans le server.xml. Rappel : je bossais avec un Tomcat 4.1.31 et une BDD MySQL. C'est l'attribut useNaming qui doit être à true pour pouvoir utiliser les JNDI !! le problème c'est que dans l'interface admin de Tomcat, si jamais vous décider de créer votre context avec cette interface, le problème est que l'attribut useNaming a la valeur false par défaut !!! l'exception déclenchée ne précise pas que c'est un problème de config !!

Voilà, j'espère que ça evitera aux autres de se tirer les cheveux pour rien !! icon_twisted.gif

A+
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2024 Invision Power Services, Inc.