Cannot create resource instance in Tomcat7
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" />
user1379574
Updated on June 04, 2022Comments
-
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.