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 <amsl...@gmail.com> 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: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to