Quantcast

Bug with tomcat JDBC connection pool?

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Bug with tomcat JDBC connection pool?

Adib-5
Hi,

I think I have run into a bug with tomcat, but wanted to check with
the user list to make sure it is a bug before  I file it.

Background:

I am using the tomact jdbc pool over the dbcp pool and I am embedding
tomcat as part of an application that clients install on their data
centers.

1) delete the lib\tomcat-dbcp.jar from the tomcat\lib

2) Configure a jdbc connection pool in server.xml in the GlobalNamingResource

<GlobalNamingResources>
    <Resource
                factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
                auth="Container"
                type="javax.sql.DataSource"
                jdbcInterceptors="StatementFinalizer;ResetAbandonedTimer"

               name="jdbc/testDB"
               driverClassName="org.postgresql.Driver"
               url="jdbc:postgresql://127.0.0.1:5432/tes"
               username="test"
               password="test"

               maxActive="20"
               maxIdle="10"
              maxWait="-1"
        />
  </GlobalNamingResources>

3) Add a resource ref to the web.xml

 <resource-ref>
    <description>Test Datasource</description>
    <res-ref-name>jdbc/testDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

4) do an a lookup for the data source

try {
                        InitialContext ctx = new InitialContext();
                        Object object = ctx.lookup("java:/comp/env/jdbc/testDB");
                        System.out.println(object.getClass().getCanonicalName());
                } catch (NamingException e) {
                        e.printStackTrace();
                }

5)  Tomcat throws an exception  java.lang.ClassNotFoundException:
org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory full stack trace
below.

It is not clear why it would be looking for dbcp DataSource when i
have my data source defined   using
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

Interestingly if the resource is defined in context.xml in META-INF
for the war there are no exceptions it just works.

Any thoughts on whether this is a bug or not?

Cheers,

----

NFO: Starting Servlet Engine: Apache Tomcat/7.0.26
Mar 4, 2012 10:09:29 AM org.apache.catalina.core.NamingContextListener
addResource
WARNING: Failed to register in JMX: javax.naming.NamingException:
Could not create resource factory instance [Root exception is
java.lang.ClassNotFoundException:
org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]
Mar 4, 2012 10:09:29 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Mar 4, 2012 10:09:29 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 852 ms
javax.naming.NamingException: Could not create resource factory
instance [Root exception is java.lang.ClassNotFoundException:
org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]
        at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:121)
        at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
        at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158)
        at javax.naming.InitialContext.lookup(InitialContext.java:392)
        at com.example.HelloServlet.doGet(HelloServlet.java:34)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.ClassNotFoundException:
org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:117)
        ... 30 more

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Bug with tomcat JDBC connection pool?

Adib-5
Tomcat source for class org.apache.naming.factory.ResourceFactory line
112 contains the following block of code which defaults the data
source to the DBCP unless the system property
javax.sql.DataSourceFactory is set.

However when I set javax.sql.DataSource factory to point to the Tomcat
jdbc connection factory I end up with different exceptions.

One thing I that does not make sense to me is why tomcat would be
trying to create a datasource object when a resource-ref is
encountered.

if (ref.getClassName().equals("javax.sql.DataSource")) {
                    String javaxSqlDataSourceFactoryClassName =
                        System.getProperty("javax.sql.DataSource.Factory",
                                           Constants.DBCP_DATASOURCE_FACTORY);
                    try {
                        factory = (ObjectFactory)
                            Class.forName(javaxSqlDataSourceFactoryClassName)
                            .newInstance();
                    } catch (Exception e) {
                        NamingException ex = new NamingException
                            ("Could not create resource factory instance");
                        ex.initCause(e);
                        throw ex;
                    }
                }


On Sun, Mar 4, 2012 at 3:37 PM, Adib <[hidden email]> wrote:

> Hi,
>
> I think I have run into a bug with tomcat, but wanted to check with
> the user list to make sure it is a bug before  I file it.
>
> Background:
>
> I am using the tomact jdbc pool over the dbcp pool and I am embedding
> tomcat as part of an application that clients install on their data
> centers.
>
> 1) delete the lib\tomcat-dbcp.jar from the tomcat\lib
>
> 2) Configure a jdbc connection pool in server.xml in the GlobalNamingResource
>
> <GlobalNamingResources>
>    <Resource
>                factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
>                auth="Container"
>                type="javax.sql.DataSource"
>                jdbcInterceptors="StatementFinalizer;ResetAbandonedTimer"
>
>               name="jdbc/testDB"
>               driverClassName="org.postgresql.Driver"
>               url="jdbc:postgresql://127.0.0.1:5432/tes"
>               username="test"
>               password="test"
>
>               maxActive="20"
>               maxIdle="10"
>              maxWait="-1"
>        />
>  </GlobalNamingResources>
>
> 3) Add a resource ref to the web.xml
>
>  <resource-ref>
>    <description>Test Datasource</description>
>    <res-ref-name>jdbc/testDB</res-ref-name>
>    <res-type>javax.sql.DataSource</res-type>
>    <res-auth>Container</res-auth>
>  </resource-ref>
>
> 4) do an a lookup for the data source
>
> try {
>                        InitialContext ctx = new InitialContext();
>                        Object object = ctx.lookup("java:/comp/env/jdbc/testDB");
>                        System.out.println(object.getClass().getCanonicalName());
>                } catch (NamingException e) {
>                        e.printStackTrace();
>                }
>
> 5)  Tomcat throws an exception  java.lang.ClassNotFoundException:
> org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory full stack trace
> below.
>
> It is not clear why it would be looking for dbcp DataSource when i
> have my data source defined   using
> factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
>
> Interestingly if the resource is defined in context.xml in META-INF
> for the war there are no exceptions it just works.
>
> Any thoughts on whether this is a bug or not?
>
> Cheers,
>
> ----
>
> NFO: Starting Servlet Engine: Apache Tomcat/7.0.26
> Mar 4, 2012 10:09:29 AM org.apache.catalina.core.NamingContextListener
> addResource
> WARNING: Failed to register in JMX: javax.naming.NamingException:
> Could not create resource factory instance [Root exception is
> java.lang.ClassNotFoundException:
> org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]
> Mar 4, 2012 10:09:29 AM org.apache.coyote.AbstractProtocol start
> INFO: Starting ProtocolHandler ["http-bio-8080"]
> Mar 4, 2012 10:09:29 AM org.apache.catalina.startup.Catalina start
> INFO: Server startup in 852 ms
> javax.naming.NamingException: Could not create resource factory
> instance [Root exception is java.lang.ClassNotFoundException:
> org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]
>        at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:121)
>        at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
>        at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
>        at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
>        at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
>        at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
>        at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
>        at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
>        at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
>        at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
>        at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158)
>        at javax.naming.InitialContext.lookup(InitialContext.java:392)
>        at com.example.HelloServlet.doGet(HelloServlet.java:34)
>        at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
>        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
>        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
>        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
>        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
>        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
>        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
>        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
>        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
>        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
>        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
>        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
>        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
>        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
>        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
>        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>        at java.lang.Thread.run(Thread.java:680)
> Caused by: java.lang.ClassNotFoundException:
> org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory
>        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
>        at java.security.AccessController.doPrivileged(Native Method)
>        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
>        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
>        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
>        at java.lang.Class.forName0(Native Method)
>        at java.lang.Class.forName(Class.java:169)
>        at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:117)
>        ... 30 more

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Bug with tomcat JDBC connection pool?

Mark Thomas-2
In reply to this post by Adib-5
On 04/03/2012 23:37, Adib wrote:
> Hi,
>
> I think I have run into a bug with tomcat, but wanted to check with
> the user list to make sure it is a bug before  I file it.
Good job you checked. It isn't a bug, it is user error.

> Background:
>
> I am using the tomact jdbc pool over the dbcp pool and I am embedding
> tomcat as part of an application that clients install on their data
> centers.
>
> 1) delete the lib\tomcat-dbcp.jar from the tomcat\lib
Unnecessary.

> 2) Configure a jdbc connection pool in server.xml in the GlobalNamingResource
Looks OK.

> 3) Add a resource ref to the web.xml
And here is where you go wrong.

You need to read [1].

You can use a <resource-ref> if all of the following are true:
a) Tomcat is able to identify a suitable factory
b) No further configuration is required.

a) is true but not what you want. Tomcat will use the default.
b) is not true. More information is required (URL, user, pwd,  etc)

Since a resource-ref is not suitable, you must define a resource-link to
a global resource or the entire resource in the context.xml.

The resource ref in web.xml is more a marker that a resource is
required. It isn't usually sufficient to define the resource.

> 4) do an a lookup for the data source
Looks OK.

> 5)  Tomcat throws an exception  java.lang.ClassNotFoundException:
> org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory full stack trace
> below.
As expected, given the error you have made.

> It is not clear why it would be looking for dbcp DataSource when i
> have my data source defined   using
> factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
Because you haven't configured you DataSource correctly.

> Interestingly if the resource is defined in context.xml in META-INF
> for the war there are no exceptions it just works.
As expected.

> Any thoughts on whether this is a bug or not?
As above. No bug, this is user error.

Mark

[1] http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Loading...