On Tue, 3 Jul 2001, Jonathan Pierce wrote:
> This may be a stupid question but I've found hundreds of messages from confused
> users on the subject of JDBC Realms and Tomcat and no good explanation or
> example. There is a documentation file JDBCRealm.howto but it doesn't describe
> how to instantiate the datasource with a code example or what additional
> property files need to be included to configure jndi properties.
>
> Like lots of other people, I'm trying to use the release Tomcat 3.2.2, configure
> multiple jdbc datasources in the server.xml file, and reference it in my
> servlet. I am only interested in using a shared database ID to connect to the
> database for all users of my servlet. The database connect info needs to be in
> Tomcat conf files since the passwords need to be reconfigured at deployment time
> outside my war file.
>
> 1. Is this behavior supported by Tomcat 3.2.2? How do I configure multiple
> database datasources and instantiate them in my code?
>
IIRC, Tomcat 3.2.2 only supports a single realm of usernames and passwords
for all of the webapps running in a single JVM. That is not the case with
4.0.
> 2. Assuming I setup the datasources like below, what properties do I use to
> assign a name to the datasource so I can reference it?
>
> <RequestInterceptor
> className="org.apache.tomcat.request.JDBCRealm"
> debug="99"
> driverName="oracle.jdbc.driver.OracleDriver"
> connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"
> connectionName="scott"
> connectionPassword="tiger"
> />
>
> <RequestInterceptor
> className="org.apache.tomcat.request.JDBCRealm"
> debug="99"
> driverName="oracle.jdbc.driver.OracleDriver"
> connectionURL="jdbc:oracle:thin:@ntserver2:1521:ORCL"
> connectionName="scott"
> connectionPassword="tiger"
> />
>
>
> 3. What do I need to add to a config file in order to access the initial context
> so I can retrieve the datasource?
>
> import javax.servlet.*;
> import javax.servlet.http.*;
> import javax.naming.*;
> import javax.sql.*;
>
> String theDataSourceName = "???";
> String theNamingProviderURL = "???";
> String theInitialContextNamingFactory = "???";
> Properties theProperties = new Properties ();
> theProperties.put("java.naming.provider.url", theNamingProviderURL);
> theProperties.put("java.naming.factory.initial",theInitialContextNamingFactory);
>
> Context theInitialContext = new InitialContext(theProperties);
> DataSource theDataSource = (DataSource) theInitialContext.lookup
> (theDatasourceName);
>
You might be confusing realms with datasources :-)
The purpose of JDBCRealm is to allow you to store the usernames,
passwords, and roles required for container-managed security (as described
in the servlet spec) in a database accessed via JDBC. When used in this
manner, only Tomcat talks to the database that you configure with
JDBCRealm -- not your application.
If you want to use a datasource for your own application data, you don't
need JDBCRealm at all. Instead, you've got a couple choices:
* Use one of the existing datasource implementations, following the
configuration documentation included with that datasource.
* Use a J2EE application server, where you can declare a
<resource-ref> in the web.xml file, and use your app server's
deployment tools to connect that to an actual database.
* Use Tomcat 4.0, which lets you do the same thing -- the connection
to a particular database is done in the "conf/server.xml" file.
Craig McClanahan