You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by vi...@thomsonreuters.com on 2014/10/29 17:45:50 UTC

NameNotFoundException: Name [jdbc/weblogin01b] is not bound in this Context. Unable to find [jdbc]

Hello
I'm having difficulty getting a JDBC DataSource using Tomcat 8.

I want to define the JDBC details in server.xml so the database identified depends on the server and not the application. It will be beneficial for me if the applications only need to know the JDBC name and not password details.

Thus I'm using GlobalNamingResources in server.xml
and ResourceLink in context.xml

I'm obviously not getting it right because I get this exception:

javax.naming.NameNotFoundException: Name [jdbc/weblogin01b] is not bound in this Context. Unable to find [jdbc].
    at org.apache.naming.NamingContext.lookup(NamingContext.java:818)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:166)
    at org.apache.naming.factory.ResourceLinkFactory.getObjectInstance(ResourceLinkFactory.java:92)
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:841)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:166)

In CATALINA_BASE/conf/server.xml

I have included a variety of slightly different resources all aiming to get to the same database schema hopefully one of them will be right:

<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/weblogin01"
        username="weblogin01"
        password="xxxxx"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.pool.OracleDataSource"
        description="Global Address Database"
        url="jdbc:oracle:thin:@10.15.120.29:1522:DGSPC"
        maxActive="15"
        maxIdle="3" />

    <Resource name="jdbc/weblogin01b"
        user="weblogin01"
        password="xxxxx"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
        factory="oracle.jdbc.pool.OracleDataSourceFactory"
        url="jdbc:oracle:thin:@10.15.120.29:1522:DGSPC"
        maxActive="20"
        maxIdle="3"
        maxWait="-1" />

    <Resource name="jdbc/weblogin01c"
        user="weblogin01"
        password="xxxxx"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@10.15.120.29:1522:DGSPC"
        maxActive="20"
        maxIdle="3"
        maxWait="-1" />

</GlobalNamingResources>

In META-INF/context.xml

I have a ResourceLink to each resource

<Context path="/testDbAccess">
    <ResourceLink name="jdbc/weblogin01"
        global="jdbc/weblogin01"
        type="javax.sql.DataSource"/>
    <ResourceLink name="jdbc/weblogin01b"
        global="jdbc/weblogin01b"
        type="javax.sql.DataSource"/>
    <ResourceLink name="jdbc/weblogin01c"
        global="jdbc/weblogin01c"
        type="javax.sql.DataSource"/>
</Context>

In web.xml I made no changes related to JDBC on the understanding that the ResourceLink elements will be sufficient.

In Java code I try to get a DataSource as follows:

String dbUser = "weblogin01b";
try {
    Context initCtx = new InitialContext();
    Context envCtx = (Context) initCtx.lookup("java:comp/env");

    // Get data source
    ds = (DataSource) envCtx.lookup("jdbc/" + dbUser);
    if (ds == null) {
        logger.log(Level.WARNING,"Null datasource for " + dbUser);
    }
}

I get similar exceptions for each of the names:
jdbc/weblogin01
jdbc/weblogin01b
jdbc/weblogin01c

After years using GlassFish, I'm struggling with Tomcat, any help would be much appreciated.

Thank you

________________________________

This e-mail is for the sole use of the intended recipient and contains information that may be privileged and/or confidential. If you are not an intended recipient, please notify the sender by return e-mail and delete this e-mail and any attachments. Certain required legal entity disclosures can be accessed on our website.<http://thomsonreuters.com/prof_disclosures/>

RE: NameNotFoundException: Name [jdbc/weblogin01b] is not bound in this Context. Unable to find [jdbc]

Posted by vi...@thomsonreuters.com.
Dan
Thank you. Jconsole mbeans pointed me in the right direction. It made me doubt that Tomcat was reading the same server.xml that I was editing. Sure enough when I found that I was not able to change the description of the Resource "UserDatabase" then I knew I was editing the wrong copy of server.xml

Netbeans makes a copy of CATALINA_HOME and uses it as CATALINA_BASE.

I was editing the one at CATALINA_HOME instead of the copy at CATALINA_BASE.

I wish Tomcat had a clear cut separation between CATALINA_HOME and CATALINA_BASE such that they are ALWAYS distinct instead of the current potential for having the same stuff in both.

Thanks again
Vince


> -----Original Message-----
> From: Daniel Mikusa [mailto:dmikusa@pivotal.io]
> Sent: 29 October 2014 17:10
> To: Tomcat Users List
> Subject: Re: NameNotFoundException: Name [jdbc/weblogin01b] is not
> bound in this Context. Unable to find [jdbc]
> 
> On Wed, Oct 29, 2014 at 12:45 PM, <vi...@thomsonreuters.com>
> wrote:
> 
> > Hello
> > I'm having difficulty getting a JDBC DataSource using Tomcat 8.
> >
> > I want to define the JDBC details in server.xml so the database
> identified
> > depends on the server and not the application. It will be beneficial
> for me
> > if the applications only need to know the JDBC name and not password
> > details.
> >
> > Thus I'm using GlobalNamingResources in server.xml
> > and ResourceLink in context.xml
> >
> > I'm obviously not getting it right because I get this exception:
> >
> > javax.naming.NameNotFoundException: Name [jdbc/weblogin01b] is not
> bound
> > in this Context. Unable to find [jdbc].
> >
> 
> Sometimes when you get a NameNotFoundException, it's because the pool
> encountered an error when it was being created.  Hence it doesn't
> actually
> exists.  A couple things you can do to troubleshoot.
> 
> 1.) Set an initial size for your pool.  This will force it to make at
> least
> one connection at startup which will generally cause it to fail fast,
> if
> there is a problem.  You can then look in the logs to see the error.
> 
> 2.) Connect with jconsole or jvisualvm and look at the mbeans for
> Tomcat.
> When the pool is actually there, you should see it in the mbeans.
> 
> 
> >     at org.apache.naming.NamingContext.lookup(NamingContext.java:818)
> >     at org.apache.naming.NamingContext.lookup(NamingContext.java:166)
> >     at
> >
> org.apache.naming.factory.ResourceLinkFactory.getObjectInstance(Resourc
> eLinkFactory.java:92)
> >     at
> >
> javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321
> )
> >     at org.apache.naming.NamingContext.lookup(NamingContext.java:841)
> >     at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
> >     at org.apache.naming.NamingContext.lookup(NamingContext.java:829)
> >     at org.apache.naming.NamingContext.lookup(NamingContext.java:166)
> >
> > In CATALINA_BASE/conf/server.xml
> >
> > I have included a variety of slightly different resources all aiming
> to
> > get to the same database schema hopefully one of them will be right:
> >
> > <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/weblogin01"
> >         username="weblogin01"
> >         password="xxxxx"
> >         auth="Container"
> >         type="javax.sql.DataSource"
> >         driverClassName="oracle.jdbc.pool.OracleDataSource"
> >
> 
> This looks suspect.  I'm pretty sure you want the JDBC driver name.
> 
> 
> >         description="Global Address Database"
> >         url="jdbc:oracle:thin:@10.15.120.29:1522:DGSPC"
> >
> 
> You could add "initialSize" here, try "1".
> 
>         maxActive="15"
> >         maxIdle="3" />
> >
> >     <Resource name="jdbc/weblogin01b"
> >         user="weblogin01"
> >         password="xxxxx"
> >         auth="Container"
> >         type="javax.sql.DataSource"
> >         driverClassName="oracle.jdbc.OracleDriver"
> >         factory="oracle.jdbc.pool.OracleDataSourceFactory"
> >
> 
> You're using a different factory (specifically Oracle's
> implementation), so
> the configuration attributes are going to be different.  Not sure how
> to
> set initial size with this implementation.
> 
> 
> >         url="jdbc:oracle:thin:@10.15.120.29:1522:DGSPC"
> >         maxActive="20"
> >         maxIdle="3"
> >         maxWait="-1" />
> >
> >     <Resource name="jdbc/weblogin01c"
> >         user="weblogin01"
> >         password="xxxxx"
> >         auth="Container"
> >         type="javax.sql.DataSource"
> >         driverClassName="oracle.jdbc.OracleDriver"
> >         url="jdbc:oracle:thin:@10.15.120.29:1522:DGSPC"
> >         maxActive="20"
> >         maxIdle="3"
> >         maxWait="-1" />
> >
> 
> This looks the most right.  I'd also try adding "initialSize" of 1.
> 
> 
> >
> > </GlobalNamingResources>
> >
> > In META-INF/context.xml
> >
> > I have a ResourceLink to each resource
> >
> > <Context path="/testDbAccess">
> >     <ResourceLink name="jdbc/weblogin01"
> >         global="jdbc/weblogin01"
> >         type="javax.sql.DataSource"/>
> >     <ResourceLink name="jdbc/weblogin01b"
> >         global="jdbc/weblogin01b"
> >         type="javax.sql.DataSource"/>
> >     <ResourceLink name="jdbc/weblogin01c"
> >         global="jdbc/weblogin01c"
> >         type="javax.sql.DataSource"/>
> >
> 
> These look OK.
> 
> 
> > </Context>
> >
> > In web.xml I made no changes related to JDBC on the understanding
> that the
> > ResourceLink elements will be sufficient.
> >
> > In Java code I try to get a DataSource as follows:
> >
> > String dbUser = "weblogin01b";
> > try {
> >     Context initCtx = new InitialContext();
> >     Context envCtx = (Context) initCtx.lookup("java:comp/env");
> >
> >     // Get data source
> >     ds = (DataSource) envCtx.lookup("jdbc/" + dbUser);
> >     if (ds == null) {
> >         logger.log(Level.WARNING,"Null datasource for " + dbUser);
> >     }
> > }
> >
> > I get similar exceptions for each of the names:
> > jdbc/weblogin01
> > jdbc/weblogin01b
> > jdbc/weblogin01c
> >
> >
> Didn't test this, but it looks OK.
> 
> Dan
> 
> 
> 
> > After years using GlassFish, I'm struggling with Tomcat, any help
> would be
> > much appreciated.
> >
> > Thank you
> >
> > ________________________________
> >
> > This e-mail is for the sole use of the intended recipient and
> contains
> > information that may be privileged and/or confidential. If you are
> not an
> > intended recipient, please notify the sender by return e-mail and
> delete
> > this e-mail and any attachments. Certain required legal entity
> disclosures
> > can be accessed on our website.<
> > http://thomsonreuters.com/prof_disclosures/>
> >

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: NameNotFoundException: Name [jdbc/weblogin01b] is not bound in this Context. Unable to find [jdbc]

Posted by Daniel Mikusa <dm...@pivotal.io>.
On Wed, Oct 29, 2014 at 12:45 PM, <vi...@thomsonreuters.com> wrote:

> Hello
> I'm having difficulty getting a JDBC DataSource using Tomcat 8.
>
> I want to define the JDBC details in server.xml so the database identified
> depends on the server and not the application. It will be beneficial for me
> if the applications only need to know the JDBC name and not password
> details.
>
> Thus I'm using GlobalNamingResources in server.xml
> and ResourceLink in context.xml
>
> I'm obviously not getting it right because I get this exception:
>
> javax.naming.NameNotFoundException: Name [jdbc/weblogin01b] is not bound
> in this Context. Unable to find [jdbc].
>

Sometimes when you get a NameNotFoundException, it's because the pool
encountered an error when it was being created.  Hence it doesn't actually
exists.  A couple things you can do to troubleshoot.

1.) Set an initial size for your pool.  This will force it to make at least
one connection at startup which will generally cause it to fail fast, if
there is a problem.  You can then look in the logs to see the error.

2.) Connect with jconsole or jvisualvm and look at the mbeans for Tomcat.
When the pool is actually there, you should see it in the mbeans.


>     at org.apache.naming.NamingContext.lookup(NamingContext.java:818)
>     at org.apache.naming.NamingContext.lookup(NamingContext.java:166)
>     at
> org.apache.naming.factory.ResourceLinkFactory.getObjectInstance(ResourceLinkFactory.java:92)
>     at
> javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
>     at org.apache.naming.NamingContext.lookup(NamingContext.java:841)
>     at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
>     at org.apache.naming.NamingContext.lookup(NamingContext.java:829)
>     at org.apache.naming.NamingContext.lookup(NamingContext.java:166)
>
> In CATALINA_BASE/conf/server.xml
>
> I have included a variety of slightly different resources all aiming to
> get to the same database schema hopefully one of them will be right:
>
> <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/weblogin01"
>         username="weblogin01"
>         password="xxxxx"
>         auth="Container"
>         type="javax.sql.DataSource"
>         driverClassName="oracle.jdbc.pool.OracleDataSource"
>

This looks suspect.  I'm pretty sure you want the JDBC driver name.


>         description="Global Address Database"
>         url="jdbc:oracle:thin:@10.15.120.29:1522:DGSPC"
>

You could add "initialSize" here, try "1".

        maxActive="15"
>         maxIdle="3" />
>
>     <Resource name="jdbc/weblogin01b"
>         user="weblogin01"
>         password="xxxxx"
>         auth="Container"
>         type="javax.sql.DataSource"
>         driverClassName="oracle.jdbc.OracleDriver"
>         factory="oracle.jdbc.pool.OracleDataSourceFactory"
>

You're using a different factory (specifically Oracle's implementation), so
the configuration attributes are going to be different.  Not sure how to
set initial size with this implementation.


>         url="jdbc:oracle:thin:@10.15.120.29:1522:DGSPC"
>         maxActive="20"
>         maxIdle="3"
>         maxWait="-1" />
>
>     <Resource name="jdbc/weblogin01c"
>         user="weblogin01"
>         password="xxxxx"
>         auth="Container"
>         type="javax.sql.DataSource"
>         driverClassName="oracle.jdbc.OracleDriver"
>         url="jdbc:oracle:thin:@10.15.120.29:1522:DGSPC"
>         maxActive="20"
>         maxIdle="3"
>         maxWait="-1" />
>

This looks the most right.  I'd also try adding "initialSize" of 1.


>
> </GlobalNamingResources>
>
> In META-INF/context.xml
>
> I have a ResourceLink to each resource
>
> <Context path="/testDbAccess">
>     <ResourceLink name="jdbc/weblogin01"
>         global="jdbc/weblogin01"
>         type="javax.sql.DataSource"/>
>     <ResourceLink name="jdbc/weblogin01b"
>         global="jdbc/weblogin01b"
>         type="javax.sql.DataSource"/>
>     <ResourceLink name="jdbc/weblogin01c"
>         global="jdbc/weblogin01c"
>         type="javax.sql.DataSource"/>
>

These look OK.


> </Context>
>
> In web.xml I made no changes related to JDBC on the understanding that the
> ResourceLink elements will be sufficient.
>
> In Java code I try to get a DataSource as follows:
>
> String dbUser = "weblogin01b";
> try {
>     Context initCtx = new InitialContext();
>     Context envCtx = (Context) initCtx.lookup("java:comp/env");
>
>     // Get data source
>     ds = (DataSource) envCtx.lookup("jdbc/" + dbUser);
>     if (ds == null) {
>         logger.log(Level.WARNING,"Null datasource for " + dbUser);
>     }
> }
>
> I get similar exceptions for each of the names:
> jdbc/weblogin01
> jdbc/weblogin01b
> jdbc/weblogin01c
>
>
Didn't test this, but it looks OK.

Dan



> After years using GlassFish, I'm struggling with Tomcat, any help would be
> much appreciated.
>
> Thank you
>
> ________________________________
>
> This e-mail is for the sole use of the intended recipient and contains
> information that may be privileged and/or confidential. If you are not an
> intended recipient, please notify the sender by return e-mail and delete
> this e-mail and any attachments. Certain required legal entity disclosures
> can be accessed on our website.<
> http://thomsonreuters.com/prof_disclosures/>
>