Hi all

On Tue, Jul 21, 2015 at 7:27 PM, Niranjan Karunanandham <
niranjan.k...@gmail.com> wrote:

> Hi Tomcat Team,
>
> On Tue, Jul 21, 2015 at 4:21 PM, Konstantin Kolinko <
> knst.koli...@gmail.com> wrote:
>
>> 2015-07-21 8:35 GMT+03:00 Niranjan Karunanandham <niranjan.k...@gmail.com
>> >:
>> > [sending to users list]
>> >
>> > On Thu, Jul 16, 2015 at 10:23 AM, Niranjan Karunanandham <
>> > niranjan.k...@gmail.com> wrote:
>> >
>> >> Hi,
>> >>
>> >> On debugging Tomcat (7.0.59), I noticed that the SelectorContext is
>> >> initialized twice when a lookup is performed for JNDI defined in web
>> >> application (META-INF/context.xml).
>> >> When the lookup is performed, the Servlet first calls the init method
>> of
>> >> InitailContext and this "returns new SelectorContext(env, true)". Then
>> it
>> >> calls the lookup method of InitialContext which again initializes the
>> >> SelectorContext but now it "returns new SelectorContext(env)" [where
>> the
>> >> SelectorContextor.initialContext is set to *false*] and then the lookup
>> >> is performed.
>>
>> 1. javax.naming.InitialContext class is not ours. It is part of JDK.
>>
>> 2. SelectorContext object is immutable. The first one has
>> "initialContext == true", the second one has "false". Those are two
>> different objects.
>>
> Why are there two different SelectorContext object being created. I
> noticed that when we do a JNDI lookup from webapp, it requires the
> Context.xml to be only read-only (please correct me if am wrong) for which
> the initialContext is false for the SelectorContext. So when is the first
> SelectorContext (where the initialContext is set to true) use?
>

On further debugging, I noticed that when JNDI lookup is performed as
mentioned in my sample, it was creating a new SelectorContext which the
initialContext as false. On trying to connect to a queue (apacheMQ), it
does not create new SelectorContext. Why is this so or am I missing
something?

This is the code (in NamingManager) which does this:





















*private static Object getURLObject(String scheme, Object urlInfo,
                              Name name, Context nameCtx,
                     Hashtable environment)        throws
NamingException {    // e.g. "ftpURLContextFactory"    ObjectFactory
factory = (ObjectFactory)ResourceManager.getFactory(
Context.URL_PKG_PREFIXES, environment, nameCtx,        "." + scheme +
"." + scheme + "URLContextFactory", defaultPkgPrefix);    if (factory
== null)      return null;    // Found object factory    try {
return factory.getObjectInstance(urlInfo, name, nameCtx, environment);
   } catch (NamingException e) {        throw e;    } catch (Exception
e) {        NamingException ne = new NamingException();
ne.setRootCause(e);        throw ne;    }}*



> 3. It is usually better to lookup the DataSource once (at startup time
>> /first access time) and cache the reference locally.
>>
>> >> Why is tomcat initializing the SelectorContext twice here?
>> >>
>> >> My Java Webapp Code which does the lookup:
>> >> *initCtx = new InitialContext();*
>> >> *Context envContext = (Context) initCtx.lookup("java:comp/env");*
>> >> *DataSource dataSource = (DataSource)
>> envContext.lookup("*jdbc/contextDB
>> >> *");*
>> >>
>> >> Resource defined in META-INF/context.xml in webapp:
>> >>
>> >> <Resource name="jdbc/contextDB" auth="Container" type
>> >> ="javax.sql.DataSource"
>> >> maxActive="100" maxIdle="30" maxWait="10000"
>> >> username="user" password="user123"
>> driverClassName="com.mysql.jdbc.Driver"
>> >>
>> >>           url="jdbc:mysql://localhost:3306/WebAppTestDB"/>
>> >>
>
>
Regards,
Nira

Reply via email to