Re: Tomcat initialize SelectorContext twice when lookup for JNDI defined in web application (META-INF/context.xml)
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. ftpURLContextFactoryObjectFactory factory = (ObjectFactory)ResourceManager.getFactory( Context.URL_PKG_PREFIXES, environment, nameCtx,. + scheme + . + scheme + URLContextFactory, defaultPkgPrefix);if (factory == null) return null;// Found object factorytry { 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=1 username=user password=user123 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/WebAppTestDB/ Regards, Nira
Re: Tomcat initialize SelectorContext twice when lookup for JNDI defined in web application (META-INF/context.xml)
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. 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=1 username=user password=user123 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/WebAppTestDB/ -- *Niranjan Karunanandham* - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org
Re: Tomcat initialize SelectorContext twice when lookup for JNDI defined in web application (META-INF/context.xml)
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? 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=1 username=user password=user123 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/WebAppTestDB/ Regards, Nira 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. 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=1 username=user password=user123 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/WebAppTestDB/ -- *Niranjan Karunanandham* - To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org -- *Niranjan Karunanandham*
Re: Tomcat initialize SelectorContext twice when lookup for JNDI defined in web application (META-INF/context.xml)
[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. 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=1 username=user password=user123 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/WebAppTestDB/ Regards, *Niranjan Karunanandham* -- *Niranjan Karunanandham*