tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
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" <>
> To: <>
> 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:


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

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):

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.

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?


> 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...
> 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...

> ---------------------------------------------------------------------------
> The most powerful application server on earth.
> The only real POJO Application Server.
> See it in Action :
> ---------------------------------------------------------------------------
> ---------------------------------------------------------------------
> To start a new topic, e-mail:
> To unsubscribe, e-mail:
> For additional commands, e-mail:

To start a new topic, e-mail:
To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message