Cannot create resource instance in Tomcat7

11,693

Your configuration looks pretty much OK (except for some typos in your web.xml file; the <res-type>java.sql.DatSource</res-type> should be <res-type>javax.sql.DataSource</res-type>).

But the problem I think is the fact that you are declaring the database resource inside the server.xml file.

Normally the application resources should be declared in the context.xml file of the application and only be declared in server.xml if they are shared between applications. So my suggestion is to declare the jdbc/testDataSource resource in your context.xml file. That should be one way to make it work.

If you must absolutely have a global resource then in your context.xml file you must add a resource link to it or it won't be visible by default.

This context is distinct from the per-web-application JNDI contexts described in the JNDI Resources HOW-TO. The resources defined in this element are not visible in the per-web-application contexts unless you explicitly link them with <ResourceLink> elements.

So the second way to make it work is to leave the resource declared in server.xml but then add something like this in your context.xml file:

<ResourceLink global="jdbc/testDataSource" 
              name="jdbc/testDataSource" 
              type="javax.sql.DataSource" />
Share:
11,693
user1379574
Author by

user1379574

Updated on June 04, 2022

Comments

  • user1379574
    user1379574 almost 2 years

    I'm trying to configure connection pool in Tomcat 7. Here is code: part of server.xml:

    <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"              
    />
    

    web.xml configuration:

    <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> 
    

    and access from jsp page:

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

    But unfortunately I get 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)
    

    How can I fix it? Thank you.