2012-07-16 6 views
4

Je suis en train de configurer pool de connexion dans Tomcat 7. Voici le code: partie de server.xml:Impossible de créer une instance de ressource dans tomcat7

<GlobalNamingResources> 
<!-- Editable user database that can also be used by 
    UserDatabaseRealm to authenticate users 
--> 
<Resource name="UserDatabase" auth="Container" 
      type="org.apache.catalina.UserDatabase" 
      description="User database that can be updated and saved" 
      factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
      pathname="conf/tomcat-users.xml" /> 


<Resource 
name="jdbc/testDataSource"         
auth="Container"            
type="javax.sql.DataSource"         
driverClassName="com.mysql.jdbc.Driver"      
url="jdbc:mysql://localhost:3306/delta_server"     
username="test" password="test"        
validationQuery="select count (*) from session_contexts"    
/> 

configuration web.xml:

<resource-ref> 
    <description> 
     Sample JNDI DataSource resource reference 
    </description> 
    <res-ref-name>jdbc/testDataSource</res-ref-name>     
    <res-type>java.sql.DatSource</res-type>       
    <res-auth>Container</res-auth>          
</resource-ref> 

et l'accès de la page jsp:

 Context initialContext = new InitialContext(); 
     Context envContext = (Context) initialContext.lookup("java:/comp/env"); 
     conn = (Connection) envContext.lookup("jdbc/testDataSource"); 

Mais malheureusement je me exception:

javax.naming.NamingException: Cannot create resource instance 
org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:146) 
javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321) 
org.apache.naming.NamingContext.lookup(NamingContext.java:826) 
org.apache.naming.NamingContext.lookup(NamingContext.java:145) 
org.apache.naming.NamingContext.lookup(NamingContext.java:814) 
org.apache.naming.NamingContext.lookup(NamingContext.java:159) 
org.apache.jsp.index_jsp._jspService(index_jsp.java:91) 
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433) 
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389) 
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

Comment puis-je résoudre ce problème? Merci.

Répondre

4

Votre configuration semble plutôt OK (à l'exception de certaines fautes de frappe dans votre fichier web.xml, le <res-type>java.sql.DatSource</res-type> doit être <res-type>javax.sql.DataSource</res-type>).

Mais le problème, je pense est le fait que vous déclarez la ressource de base de données dans le fichier server.xml.

Normalement, les ressources de l'application doivent être déclarées dans le fichier context.xml de l'application et ne doivent être déclarées au server.xml que si elles sont partagées entre les applications. Donc, ma suggestion est de déclarer la ressource jdbc/testDataSource dans votre fichier context.xml. Cela devrait être une façon de le faire fonctionner.

Si vous devez absolument avoir une ressource globale alors dans votre fichier context.xmlyou must add a resource link to it or it won't be visible by default.

Ce contexte est distinct des contextes JNDI d'application Web par application décrits dans le HOWTO JNDI Resources. Les ressources définies dans cet élément ne sont pas visibles dans les contextes d'application Web, sauf si vous les liez explicitement avec les éléments <ResourceLink>.

Ainsi, la deuxième façon de le faire fonctionner est de laisser la ressource déclarée server.xml mais ajouter quelque chose comme ceci dans votre fichier context.xml:

<ResourceLink global="jdbc/testDataSource" 
       name="jdbc/testDataSource" 
       type="javax.sql.DataSource" /> 
Questions connexes