tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Pid...@pidster.com>
Subject Re: Dynamically adding a resource to a context
Date Wed, 01 Oct 2008 09:50:08 GMT
Johnny Kewl wrote:
> 
> ----- Original Message ----- From: "Scott Dunbar" <scott@xigole.com>
> To: <users@tomcat.apache.org>
> Sent: Tuesday, September 30, 2008 10:22 PM
> Subject: Dynamically adding a resource to a context
> 
> 
>> Hi all,
>> I'm honestly not positive that what I want to do is a good idea but
>> the basic concept is that I want to dynamically add a Resource (a JNDI
>> JDBC DataSource) to a Context.  The idea is that I will be dynamically
>> creating databases for new users and want to have a database
>> connection pool for each user.
>>
>> I've been able to simply hand modify
>> ${catalina.home}/conf/Catalina/localhost/contextname.xml and seen that
>> I can now access the new DataSource.  What I'm looking for is a
>> programmatic way to do the same thing, short of parsing and rewriting
>> the XML myself. I've dug though the MBean classes and am honestly a
>> bit confused.
>>
>> Is there something that I'm missing?  This is Tomcat 6.0.18 under
>> Linux and/or Windows.
>>
>> Thanks for any help.

The code for the JNDI Context in Tomcat is available in various classes
here, or thereabouts:

org.apache.naming.*
org.apache.naming.factory.*
org.apache.naming.java.*
org.apache.naming.resources.*

JNDI resources are only available AFAIK (via the configured name) from
objects inside a web application Context (not the same as a JNDI
context).  Resources configured in server.xml, context.xml are available
via a different route in a Valve, though I don't think this is relevant
here.

It seems complicated to try and hook your pools into this though and I
don't know if TC will let you store an object in java:/comp/env/jdbc, so
you may prefer to try the following...

(I assume here, that you're able to configure the pool per client from a
properties file or data persisted elsewhere, so that it recreates itself
after restarts etc.)


Tomcat's connection pool is a repackaged version of the Commons Database
Connection Pool (DBCP):

http://commons.apache.org/dbcp/


The following seems like a reasonably complete tutorial on using Commons
Pool/DBCP to create and store a JNDI Datasource.  Look out for any
differences in more recent versions of Pool/DBCP.

http://today.java.net/pub/a/today/2005/11/17/app-managed-datasources-with-commons-dbcp.html


Now you only need to decide how and when to insert the pool, but a
servlet context listener would probably do.  It's a simple minimum
requirement for any user/developer to include in their app and would
allow you to code the setup/tear-down on a per user basis without
exposing that code to the user.

Downside is that it would create a pool per web-app.

Do your users have a per host or per application pool?



p




> Scott, dont think so, I think the pools are created either as Tomcat
> starts or as the servlets starts...
> I suppose you could write your own JNDI dB pool class as decribed here...
> http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html
> 
> By definition, if you giving each user their own dB... a single
> connection, its going to be some kind of user pool, not a connection
> pool...

A single database != a single connection
A user pool != a connection pool

The OP could have a server farm, and the per user database(s) be
distributed over lots of different physical servers.

> Unusual I must say... possibly a user table in a dB is a better way to
> go... but its your app.
> 
> ... this is what you need to know...
> 
> The INIT function in a servlet runs once when it starts... and its quite
> easy and possible to use a dB pool without using JNDI...
> ie many people use their own, or a third party dB pool and usually then
> dont use JNDI because it becomes a self contained war... especially in
> cases where there is an embedded dB...
> 
> In your case you would set up your user pool in INIT... use normal
> JDBC... and use it in the servlet.

This isn't the appropriate solution - as it would require the OP as
system admin to insert code into all of his users servlets.  I suspect
the choice of JNDI as a repository was aimed at avoiding this.

> Then run it against the logged in user.... or alternatively store
> connections as session cookies.... will then also need a listener...

You can't store a connection as a session cookie.

> It really depends on how hot your JDBC is ;) these pools are pretty
> smart things... and make suer you understand that a servlet is multi
> threaded...



> ---------------------------------------------------------------------------
> HARBOR : http://www.kewlstuff.co.za/index.htm
> The most powerful application server on earth.
> The only real POJO Application Server.
> See it in Action : http://www.kewlstuff.co.za/cd_tut_swf/whatisejb1.htm
> ---------------------------------------------------------------------------
> 
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
> 
> 


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


Mime
View raw message