Re: Tomcat JNDI custom resource factory questions

2012-09-12 Thread Daniel Mikusa
On Sep 12, 2012, at 1:52 AM, Kirill Ilyukhin wrote:

 Hi!
 
 I am using Tomcat 7.0.29 with a custom JNDI resource factory
 (http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html#Adding_Custom_Resource_Factories).
 The factory creates a connection to data server which then can be
 shared between servlets.
 Two questions regarding the resource usage.
 
 1. Creation of the resource factory, isn't is supposed to be thread-safe?

As I understand it, your ObjectFactory implementation needs to be thread safe.  
See section 4.5 of the link below.

  
http://docs.oracle.com/javase/1.3/docs/guide/jndi/spec/spi/jndispi.fm.html#1007939

 The resource (connection) is used by two servlets which obtains it on
 start-up. It works fine if the servlets are loaded one after another -
 the first servlet asks JNDI for a connection, JNDI creates a factory,
 the factory creates a connection, JNDI gives the connection to the
 servlet; the second one ask JNDI for a connection and immediately gets
 the same connection, without calling the factory. But if the servlets
 are being started exactly at the same time, they get two different
 connections created by two different factories. Shouldn't the factory
 singleton-ness be managed by Tomcat?

Look at the resource definition...

singleton

Specify whether this resource definition is for a singleton resource, i.e. one 
where there is only a single instance of the resource. If this attribute is 
true, multiple JNDI lookups for this resource will return the same object. If 
this attribute is false, multiple JNDI lookups for this resource will return 
different objects. This attribute must be true for javax.sql.DataSource 
resources to enable JMX registration of the DataSource. The value of this 
attribute must be true or false. By default, this attribute is true.

https://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Resource_Definitions

 
 2. What is the correct way to close the resource?
 How should I close the resource if the webapp is being
 stopped/undeployed?

Again, look at the resource definition...

closeMethod 

Name of the zero-argument method to call on a singleton resource when it is no 
longer required. This is intended to speed up clean-up of resources that would 
otherwise happen as part of garbage collection. This attribute is ignored if 
the singleton attribute is false. If not specificed, no default is defined and 
no close method will be called.

https://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Resource_Definitions

Dan


 My factory creates a connection on please create
 a resource call somewhere from inside JNDI, lets the connection go
 and doesn't know how many servlets use it. Users of the resource are
 independent, they do not know how many of them are and do not know
 when the resource can be closed. So I would expect some kind of it's
 time to close the resource(s) call from JNDI. Is there one?
 I know that I can track all the resources creation in a
 ServletContextListener and then close them in contextDestroyed(), but
 I hope there is a nicer way.
 
 
 Thanks in advance,
 Kirill
 
 -
 To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
 For additional commands, e-mail: users-h...@tomcat.apache.org
 


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



Tomcat JNDI custom resource factory questions

2012-09-11 Thread Kirill Ilyukhin
Hi!

I am using Tomcat 7.0.29 with a custom JNDI resource factory
(http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html#Adding_Custom_Resource_Factories).
The factory creates a connection to data server which then can be
shared between servlets.
Two questions regarding the resource usage.

1. Creation of the resource factory, isn't is supposed to be thread-safe?
The resource (connection) is used by two servlets which obtains it on
start-up. It works fine if the servlets are loaded one after another -
the first servlet asks JNDI for a connection, JNDI creates a factory,
the factory creates a connection, JNDI gives the connection to the
servlet; the second one ask JNDI for a connection and immediately gets
the same connection, without calling the factory. But if the servlets
are being started exactly at the same time, they get two different
connections created by two different factories. Shouldn't the factory
singleton-ness be managed by Tomcat?

2. What is the correct way to close the resource?
How should I close the resource if the webapp is being
stopped/undeployed? My factory creates a connection on please create
a resource call somewhere from inside JNDI, lets the connection go
and doesn't know how many servlets use it. Users of the resource are
independent, they do not know how many of them are and do not know
when the resource can be closed. So I would expect some kind of it's
time to close the resource(s) call from JNDI. Is there one?
I know that I can track all the resources creation in a
ServletContextListener and then close them in contextDestroyed(), but
I hope there is a nicer way.


Thanks in advance,
Kirill

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