619 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			619 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| 
								 | 
							
								<html><head><META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>Apache Tomcat 6.0 - JNDI Datasource HOW-TO</title><meta name="author" value="Les Hughes"><meta name="email" value="leslie.hughes@rubus.com"><meta name="author" value="David Haraburda"><meta name="email" value="david-tomcat@haraburda.com"><meta name="author" value="Glenn Nielsen"><meta name="email" value=""><meta name="author" value="Yoav Shapira"><meta name="email" value="yoavs@apache.org"></head><body bgcolor="#ffffff" text="#000000" link="#525D76" alink="#525D76" vlink="#525D76"><table border="0" width="100%" cellspacing="0"><!--PAGE HEADER--><tr><td><!--PROJECT LOGO--><a href="http://tomcat.apache.org/"><img src="./images/tomcat.gif" align="right" alt="
							 | 
						||
| 
								 | 
							
								      The Apache Tomcat Servlet/JSP Container
							 | 
						||
| 
								 | 
							
								    " border="0"></a></td><td><font face="arial,helvetica,sanserif"><h1>Apache Tomcat 6.0</h1></font></td><td><!--APACHE LOGO--><a href="http://www.apache.org/"><img src="./images/asf-logo.gif" align="right" alt="Apache Logo" border="0"></a></td></tr></table><table border="0" width="100%" cellspacing="4"><!--HEADER SEPARATOR--><tr><td colspan="2"><hr noshade="noshade" size="1"></td></tr><tr><!--LEFT SIDE NAVIGATION--><td width="20%" valign="top" nowrap="true"><p><strong>Links</strong></p><ul><li><a href="index.html">Docs Home</a></li><li><a href="http://tomcat.apache.org/faq">FAQ</a></li></ul><p><strong>User Guide</strong></p><ul><li><a href="introduction.html">1) Introduction</a></li><li><a href="setup.html">2) Setup</a></li><li><a href="appdev/index.html">3) First webapp</a></li><li><a href="deployer-howto.html">4) Deployer</a></li><li><a href="manager-howto.html">5) Manager</a></li><li><a href="realm-howto.html">6) Realms and AAA</a></li><li><a href="security-manager-howto.html">7) Security Manager</a></li><li><a href="jndi-resources-howto.html">8) JNDI Resources</a></li><li><a href="jndi-datasource-examples-howto.html">9) JDBC DataSources</a></li><li><a href="class-loader-howto.html">10) Classloading</a></li><li><a href="jasper-howto.html">11) JSPs</a></li><li><a href="ssl-howto.html">12) SSL</a></li><li><a href="ssi-howto.html">13) SSI</a></li><li><a href="cgi-howto.html">14) CGI</a></li><li><a href="proxy-howto.html">15) Proxy Support</a></li><li><a href="mbeans-descriptor-howto.html">16) MBean Descriptor</a></li><li><a href="default-servlet.html">17) Default Servlet</a></li><li><a href="cluster-howto.html">18) Clustering</a></li><li><a href="balancer-howto.html">19) Load Balancer</a></li><li><a href="connectors.html">20) Connectors</a></li><li><a href="monitoring.html">21) Monitoring and Management</a></li><li><a href="logging.html">22) Logging</a></li><li><a href="apr.html">23) APR</a></li><li><a href="virtual-hosting-howto.html">24) Virtual Hosting</a></li><li><a href="aio.html">25) Advanced IO</a></li><li><a href="extras.html">26) Additional Components</a></li><li><a href="maven-jars.html">27) Mavenized</a></li></ul><p><strong>Reference</strong></p><ul><li><a href="RELEASE-NOTES.txt">Release Notes</a></li><li><a href="config/index.html">Configuration</a></li><li><a href="api/index.html">Javadocs</a></li><li><a href="http://tomcat.apache.org/connectors-doc/">JK 1.2 Documentation</a></li></ul><p><strong>Apache Tomcat Development</strong></p><ul><li><a href="building.html">Building</a></li><li><a href="changelog.html">Changelog</a></li><li><a href="status.html">Status</a></li><li><a href="developers.html">Developers</a></li><li><a href="architecture/index.html">Architecture</a></li><li><a href="funcspecs/index.html">Functional Specs.</a></li></ul></td><!--RIGHT SIDE MAIN BODY--><td width="80%" valign="top" align="left"><table border="0" width="100%" cellspacing="4"><tr><td align="left" valign="top"><h1>Apache Tomcat 6.0</h1><h2>JNDI Datasource HOW-TO</h2></td><td align="right" valign="top" nowrap="true"><small><a href="printer/jndi-datasource-examples-howto.html"><img src="./images/printer.gif" border="0" alt="Printer Friendly Version"><br>print-friendly<br>version
							 | 
						||
| 
								 | 
							
								                    </a></small></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Table of Contents"><strong>Table of Contents</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								<a href="#Introduction">Introduction</a><br>
							 | 
						||
| 
								 | 
							
								<a href="#Database Connection Pool (DBCP) Configurations">
							 | 
						||
| 
								 | 
							
								Database Connection Pool (DBCP) Configurations</a><br>
							 | 
						||
| 
								 | 
							
								<a href="#Non DBCP Solutions">Non DBCP Solutions</a><br>
							 | 
						||
| 
								 | 
							
								<a href="#Oracle 8i with OCI client">Oracle 8i with OCI client</a><br>
							 | 
						||
| 
								 | 
							
								<a href="#Common Problems">Common Problems</a><br>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Introduction"><strong>Introduction</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>JNDI Datasource configuration is covered extensively in the
							 | 
						||
| 
								 | 
							
								JNDI-Resources-HOWTO.  However, feedback from <code>tomcat-user</code> has
							 | 
						||
| 
								 | 
							
								shown that specifics for individual configurations can be rather tricky.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>Here then are some example configurations that have been posted to
							 | 
						||
| 
								 | 
							
								tomcat-user for popular databases and some general tips for db useage.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>You should be aware that since these notes are derived from configuration
							 | 
						||
| 
								 | 
							
								and/or feedback posted to <code>tomcat-user</code> YMMV :-). Please let us
							 | 
						||
| 
								 | 
							
								know if you have any other tested configurations that you feel may be of use
							 | 
						||
| 
								 | 
							
								to the wider audience, or if you feel we can improve this section in anyway.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								<b>Please note that JNDI resource configuration changed somewhat between
							 | 
						||
| 
								 | 
							
								Tomcat 5.0.x and Tomcat 5.5.x.</b>  You will most likely need to modify older
							 | 
						||
| 
								 | 
							
								JNDI resource configurations to match the syntax in the example below in order
							 | 
						||
| 
								 | 
							
								to make them work in Tomcat 6.x.x.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Also, please note that JNDI DataSource configuration in general, and this 
							 | 
						||
| 
								 | 
							
								tutorial in particular, assumes that you have read and understood the 
							 | 
						||
| 
								 | 
							
								<a href="config/context.html">Context</a> and 
							 | 
						||
| 
								 | 
							
								<a href="config/host.html">Host</a> configuration references, including
							 | 
						||
| 
								 | 
							
								the section about Automatic Application Deployment in the latter reference.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Database Connection Pool (DBCP) Configurations"><strong>Database Connection Pool (DBCP) Configurations</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>DBCP provides support for JDBC 2.0.  On systems using a 1.4 JVM DBCP
							 | 
						||
| 
								 | 
							
								will support JDBC 3.0. Please let us know if you have used DBCP and its
							 | 
						||
| 
								 | 
							
								JDBC 3.0 features with a 1.4 JVM.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>See the <a href="http://jakarta.apache.org/commons/dbcp/configuration.html">
							 | 
						||
| 
								 | 
							
								DBCP documentation</a> for a complete list of configuration parameters.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Installation"><strong>Installation</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<p>DBCP uses the Jakarta-Commons Database Connection Pool. It relies on
							 | 
						||
| 
								 | 
							
								number of Jakarta-Commons components:
							 | 
						||
| 
								 | 
							
								<ul>
							 | 
						||
| 
								 | 
							
								<li>Jakarta-Commons DBCP</li>
							 | 
						||
| 
								 | 
							
								<li>Jakarta-Commons Collections</li>
							 | 
						||
| 
								 | 
							
								<li>Jakarta-Commons Pool</li>
							 | 
						||
| 
								 | 
							
								</ul>
							 | 
						||
| 
								 | 
							
								These libraries are located in a single JAR at 
							 | 
						||
| 
								 | 
							
								<code>$CATALINA_HOME/lib/tomcat-dbcp.jar</code>. However,
							 | 
						||
| 
								 | 
							
								only the classes needed for connection pooling have been included, and the
							 | 
						||
| 
								 | 
							
								packages have been renamed to avoid interfering with applications.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Preventing dB connection pool leaks"><strong>Preventing dB connection pool leaks</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								A database connection pool creates and manages a pool of connections
							 | 
						||
| 
								 | 
							
								to a database. Recycling and reusing already existing connections
							 | 
						||
| 
								 | 
							
								to a dB is more efficient than opening a new connection.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								There is one problem with connection pooling.  A web application has
							 | 
						||
| 
								 | 
							
								to explicetely close ResultSet's, Statement's, and Connection's.
							 | 
						||
| 
								 | 
							
								Failure of a web application to close these resources can result in
							 | 
						||
| 
								 | 
							
								them never being available again for reuse, a db connection pool "leak".
							 | 
						||
| 
								 | 
							
								This can eventually result in your web application db connections failing
							 | 
						||
| 
								 | 
							
								if there are no more available connections.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								There is a solution to this problem.  The Jakarta-Commons DBCP can be
							 | 
						||
| 
								 | 
							
								configured to track and recover these abandoned dB connections.  Not
							 | 
						||
| 
								 | 
							
								only can it recover them, but also generate a stack trace for the code
							 | 
						||
| 
								 | 
							
								which opened these resources and never closed them.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								To configure a DBCP DataSource so that abandoned dB connections are
							 | 
						||
| 
								 | 
							
								removed and recycled add the following attribute to the
							 | 
						||
| 
								 | 
							
								<code>Resource</code> configuration for your DBCP DataSource:
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								            removeAbandoned="true"
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								When available db connections run low DBCP will recover and recyle
							 | 
						||
| 
								 | 
							
								any abandoned dB connections it finds. The default is <code>false</code>.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Use the <code>removeAbandonedTimeout</code> attribute to set the number
							 | 
						||
| 
								 | 
							
								of seconds a dB connection has been idle before it is considered abandoned.
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								            removeAbandonedTimeout="60"
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								The default timeout for removing abandoned connections is 300 seconds.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								The <code>logAbandoned</code> attribute can be set to <code>true</code>
							 | 
						||
| 
								 | 
							
								if you want DBCP to log a stack trace of the code which abandoned the
							 | 
						||
| 
								 | 
							
								dB connection resources.
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								            logAbandoned="true"
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								The default is <code>false</code>.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="MySQL DBCP Example"><strong>MySQL DBCP Example</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3>0. Introduction</h3>
							 | 
						||
| 
								 | 
							
								<p>Versions of <a href="http://www.mysql.com/products/mysql/index.html">MySQL</a> and JDBC drivers that have been reported to work:
							 | 
						||
| 
								 | 
							
								<ul>
							 | 
						||
| 
								 | 
							
								<li>MySQL 3.23.47, MySQL 3.23.47 using InnoDB,, MySQL 3.23.58,  MySQL 4.0.1alpha</li>
							 | 
						||
| 
								 | 
							
								<li><a href="http://www.mysql.com/products/connector-j">Connector/J</a> 3.0.11-stable (the official JDBC Driver)</li>
							 | 
						||
| 
								 | 
							
								<li><a href="http://mmmysql.sourceforge.net">mm.mysql</a> 2.0.14 (an old 3rd party JDBC Driver)</li>
							 | 
						||
| 
								 | 
							
								</ul>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>Before you proceed, don't forget to copy the JDBC Driver's jar into <code>$CATALINA_HOME/lib</code>.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3>1. MySQL configuration</h3>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Ensure that you follow these instructions as variations can cause problems.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>Create a new test user, a new database and a single test table.
							 | 
						||
| 
								 | 
							
								Your MySQL user <strong>must</strong> have a password assigned. The driver
							 | 
						||
| 
								 | 
							
								will fail if you try to connect with an empty password.
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								mysql> GRANT ALL PRIVILEGES ON *.* TO javauser@localhost 
							 | 
						||
| 
								 | 
							
								    ->   IDENTIFIED BY 'javadude' WITH GRANT OPTION;
							 | 
						||
| 
								 | 
							
								mysql> create database javatest;
							 | 
						||
| 
								 | 
							
								mysql> use javatest;
							 | 
						||
| 
								 | 
							
								mysql> create table testdata (
							 | 
						||
| 
								 | 
							
								    ->   id int not null auto_increment primary key,
							 | 
						||
| 
								 | 
							
								    ->   foo varchar(25), 
							 | 
						||
| 
								 | 
							
								    ->   bar int);
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								<blockquote>
							 | 
						||
| 
								 | 
							
								<strong>Note:</strong> the above user should be removed once testing is
							 | 
						||
| 
								 | 
							
								complete!
							 | 
						||
| 
								 | 
							
								</blockquote>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>Next insert some test data into the testdata table.
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								mysql> insert into testdata values(null, 'hello', 12345);
							 | 
						||
| 
								 | 
							
								Query OK, 1 row affected (0.00 sec)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mysql> select * from testdata;
							 | 
						||
| 
								 | 
							
								+----+-------+-------+
							 | 
						||
| 
								 | 
							
								| ID | FOO   | BAR   |
							 | 
						||
| 
								 | 
							
								+----+-------+-------+
							 | 
						||
| 
								 | 
							
								|  1 | hello | 12345 |
							 | 
						||
| 
								 | 
							
								+----+-------+-------+
							 | 
						||
| 
								 | 
							
								1 row in set (0.00 sec)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								mysql>
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3>2. Context configuration</h3>
							 | 
						||
| 
								 | 
							
								<p>Configure the JNDI DataSource in Tomcat by adding a declaration for your
							 | 
						||
| 
								 | 
							
								resource to your <a href="config/context.html">Context</a>.</p>
							 | 
						||
| 
								 | 
							
								<p>For example:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								<Context path="/DBTest" docBase="DBTest"
							 | 
						||
| 
								 | 
							
								        debug="5" reloadable="true" crossContext="true">
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    <!-- maxActive: Maximum number of dB connections in pool. Make sure you
							 | 
						||
| 
								 | 
							
								         configure your mysqld max_connections large enough to handle
							 | 
						||
| 
								 | 
							
								         all of your db connections. Set to 0 for no limit.
							 | 
						||
| 
								 | 
							
								         -->
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    <!-- maxIdle: Maximum number of idle dB connections to retain in pool.
							 | 
						||
| 
								 | 
							
								         Set to -1 for no limit.  See also the DBCP documentation on this
							 | 
						||
| 
								 | 
							
								         and the minEvictableIdleTimeMillis configuration parameter.
							 | 
						||
| 
								 | 
							
								         -->
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    <!-- maxWait: Maximum time to wait for a dB connection to become available
							 | 
						||
| 
								 | 
							
								         in ms, in this example 10 seconds. An Exception is thrown if
							 | 
						||
| 
								 | 
							
								         this timeout is exceeded.  Set to -1 to wait indefinitely.
							 | 
						||
| 
								 | 
							
								         -->
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    <!-- username and password: MySQL dB username and password for dB connections  -->
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    <!-- driverClassName: Class name for the old mm.mysql JDBC driver is
							 | 
						||
| 
								 | 
							
								         org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
							 | 
						||
| 
								 | 
							
								         Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
							 | 
						||
| 
								 | 
							
								         -->
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    <!-- url: The JDBC connection url for connecting to your MySQL dB.
							 | 
						||
| 
								 | 
							
								         The autoReconnect=true argument to the url makes sure that the
							 | 
						||
| 
								 | 
							
								         mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
							 | 
						||
| 
								 | 
							
								         connection.  mysqld by default closes idle connections after 8 hours.
							 | 
						||
| 
								 | 
							
								         -->
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
							 | 
						||
| 
								 | 
							
								               maxActive="100" maxIdle="30" maxWait="10000"
							 | 
						||
| 
								 | 
							
								               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
							 | 
						||
| 
								 | 
							
								               url="jdbc:mysql://localhost:3306/javatest?autoReconnect=true"/>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</Context>
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3>3. web.xml configuration</h3>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>Now create a <code>WEB-INF/web.xml</code> for this test application.
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
							 | 
						||
| 
								 | 
							
								    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
							 | 
						||
| 
								 | 
							
								    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
							 | 
						||
| 
								 | 
							
								http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
							 | 
						||
| 
								 | 
							
								    version="2.4">
							 | 
						||
| 
								 | 
							
								  <description>MySQL Test App</description>
							 | 
						||
| 
								 | 
							
								  <resource-ref>
							 | 
						||
| 
								 | 
							
								      <description>DB Connection</description>
							 | 
						||
| 
								 | 
							
								      <res-ref-name>jdbc/TestDB</res-ref-name>
							 | 
						||
| 
								 | 
							
								      <res-type>javax.sql.DataSource</res-type>
							 | 
						||
| 
								 | 
							
								      <res-auth>Container</res-auth>
							 | 
						||
| 
								 | 
							
								  </resource-ref>
							 | 
						||
| 
								 | 
							
								</web-app>
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3>4. Test code</h3>
							 | 
						||
| 
								 | 
							
								<p>Now create a simple <code>test.jsp</code> page for use later.
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
							 | 
						||
| 
								 | 
							
								<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<sql:query var="rs" dataSource="jdbc/TestDB">
							 | 
						||
| 
								 | 
							
								select id, foo, bar from testdata
							 | 
						||
| 
								 | 
							
								</sql:query>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<html>
							 | 
						||
| 
								 | 
							
								  <head>
							 | 
						||
| 
								 | 
							
								    <title>DB Test</title>
							 | 
						||
| 
								 | 
							
								  </head>
							 | 
						||
| 
								 | 
							
								  <body>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  <h2>Results</h2>
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								<c:forEach var="row" items="${rs.rows}">
							 | 
						||
| 
								 | 
							
								    Foo ${row.foo}<br/>
							 | 
						||
| 
								 | 
							
								    Bar ${row.bar}<br/>
							 | 
						||
| 
								 | 
							
								</c:forEach>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  </body>
							 | 
						||
| 
								 | 
							
								</html>
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>That JSP page makes use of <a href="http://java.sun.com/products/jsp/jstl">JSTL</a>'s SQL and Core taglibs. You can get it from Sun's <a href="http://java.sun.com/webservices/downloads/webservicespack.html">Java Web Services Developer Pack</a> or <a href="http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html">Jakarta Taglib Standard 1.1</a> project - just make sure you get a 1.1.x release. Once you have JSTL, copy <code>jstl.jar</code> and <code>standard.jar</code> to your web app's <code>WEB-INF/lib</code> directory.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>Finally deploy your web app into <code>$CATALINA_HOME/webapps</code> either
							 | 
						||
| 
								 | 
							
								as a warfile called <code>DBTest.war</code> or into a sub-directory called
							 | 
						||
| 
								 | 
							
								<code>DBTest</code></p>
							 | 
						||
| 
								 | 
							
								<p>Once deployed, point a browser at
							 | 
						||
| 
								 | 
							
								<code>http://localhost:8080/DBTest/test.jsp</code> to view the fruits of
							 | 
						||
| 
								 | 
							
								your hard work.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Oracle 8i, 9i & 10g"><strong>Oracle 8i, 9i & 10g</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<h3>0.    Introduction</h3>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>Oracle requires minimal changes from the MySQL configuration except for the
							 | 
						||
| 
								 | 
							
								usual gotchas :-)</p>
							 | 
						||
| 
								 | 
							
								<p>Drivers for older Oracle versions may be distributed as *.zip files rather
							 | 
						||
| 
								 | 
							
								than *.jar files. Tomcat will only use <code>*.jar</code> files installed in
							 | 
						||
| 
								 | 
							
								<code>$CATALINA_HOME/lib</code>. Therefore <code>classes111.zip</code>
							 | 
						||
| 
								 | 
							
								or <code>classes12.zip</code> will need to be renamed with a <code>.jar</code>
							 | 
						||
| 
								 | 
							
								extension. Since jarfiles are zipfiles, there is no need to unzip and jar these
							 | 
						||
| 
								 | 
							
								files - a simple rename will suffice.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>For Oracle 9i onwards you should use <code>oracle.jdbc.OracleDriver</code>
							 | 
						||
| 
								 | 
							
								rather than <code>oracle.jdbc.driver.OracleDriver</code> as Oracle have stated
							 | 
						||
| 
								 | 
							
								that <code>oracle.jdbc.driver.OracleDriver</code> is deprecated and support
							 | 
						||
| 
								 | 
							
								for this driver class will be discontinued in the next major release.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3>1. Context configuration</h3>
							 | 
						||
| 
								 | 
							
								<p>In a similar manner to the mysql config above, you will need to define your
							 | 
						||
| 
								 | 
							
								Datasource in your <a href="config/context.html">Context</a>. Here we define a
							 | 
						||
| 
								 | 
							
								Datasource called myoracle using the thin driver to connect as user scott,
							 | 
						||
| 
								 | 
							
								password tiger to the sid called mysid. (Note: with the thin driver this sid is
							 | 
						||
| 
								 | 
							
								not the same as the tnsname). The schema used will be the default schema for the
							 | 
						||
| 
								 | 
							
								user scott.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>Use of the OCI driver should simply involve a changing thin to oci in the URL string.
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								<Resource name="jdbc/myoracle" auth="Container"
							 | 
						||
| 
								 | 
							
								              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
							 | 
						||
| 
								 | 
							
								              url="jdbc:oracle:thin:@127.0.0.1:1521:mysid"
							 | 
						||
| 
								 | 
							
								              username="scott" password="tiger" maxActive="20" maxIdle="10"
							 | 
						||
| 
								 | 
							
								              maxWait="-1"/> 
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3>2.    web.xml configuration</h3>
							 | 
						||
| 
								 | 
							
								<p>You should ensure that you respect the element ordering defined by the DTD when you
							 | 
						||
| 
								 | 
							
								create you applications web.xml file.</p>
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								<resource-ref>
							 | 
						||
| 
								 | 
							
								 <description>Oracle Datasource example</description>
							 | 
						||
| 
								 | 
							
								 <res-ref-name>jdbc/myoracle</res-ref-name>
							 | 
						||
| 
								 | 
							
								 <res-type>javax.sql.DataSource</res-type>
							 | 
						||
| 
								 | 
							
								 <res-auth>Container</res-auth>
							 | 
						||
| 
								 | 
							
								</resource-ref>
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								<h3>3.   Code example</h3>
							 | 
						||
| 
								 | 
							
								<p>You can use the same example application as above (asuming you create the required DB
							 | 
						||
| 
								 | 
							
								instance, tables etc.) replacing the Datasource code with something like</p>
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								Context initContext = new InitialContext();
							 | 
						||
| 
								 | 
							
								Context envContext  = (Context)initContext.lookup("java:/comp/env");
							 | 
						||
| 
								 | 
							
								DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
							 | 
						||
| 
								 | 
							
								Connection conn = ds.getConnection();
							 | 
						||
| 
								 | 
							
								//etc.
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="PostgreSQL"><strong>PostgreSQL</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<h3>0.    Introduction</h3>
							 | 
						||
| 
								 | 
							
								<p>PostgreSQL is configured in a similar manner to Oracle.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3>1. Required files </h3>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Copy the Postgres JDBC jar to $CATALINA_HOME/lib. As with Oracle, the
							 | 
						||
| 
								 | 
							
								jars need to be in this directory in order for DBCP's Classloader to find
							 | 
						||
| 
								 | 
							
								them. This has to be done regardless of which configuration step you take next.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3>2. Resource configuration</h3>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								You have two choices here: define a datasource that is shared across all Tomcat
							 | 
						||
| 
								 | 
							
								applications, or define a datasource specifically for one application.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h4>2a. Shared resource configuration</h4>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Use this option if you wish to define a datasource that is shared across
							 | 
						||
| 
								 | 
							
								multiple Tomcat applications, or if you just prefer defining your datasource
							 | 
						||
| 
								 | 
							
								in this file.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								<p><i>This author has not had success here, although others have reported so.
							 | 
						||
| 
								 | 
							
								Clarification would be appreciated here.</i></p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								<Resource name="jdbc/postgres" auth="Container"
							 | 
						||
| 
								 | 
							
								          type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
							 | 
						||
| 
								 | 
							
								          url="jdbc:postgresql://127.0.0.1:5432/mydb"
							 | 
						||
| 
								 | 
							
								          username="myuser" password="mypasswd" maxActive="20" maxIdle="10" maxWait="-1"/>
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								<h4>2b. Application-specific resource configuration</h4>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Use this option if you wish to define a datasource specific to your application,
							 | 
						||
| 
								 | 
							
								not visible to other Tomcat applications. This method is less invasive to your
							 | 
						||
| 
								 | 
							
								Tomcat installation.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Create a resource definition for your <a href="config/context.html">Context</a>.
							 | 
						||
| 
								 | 
							
								The Context element should look something like the following.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								<Context path="/someApp" docBase="someApp"
							 | 
						||
| 
								 | 
							
								   crossContext="true" reloadable="true" debug="1">
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<Resource name="jdbc/postgres" auth="Container"
							 | 
						||
| 
								 | 
							
								          type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
							 | 
						||
| 
								 | 
							
								          url="jdbc:postgresql://127.0.0.1:5432/mydb"
							 | 
						||
| 
								 | 
							
								          username="myuser" password="mypasswd" maxActive="20" maxIdle="10"
							 | 
						||
| 
								 | 
							
								maxWait="-1"/>
							 | 
						||
| 
								 | 
							
								</Context>
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h3>3. web.xml configuration</h3>
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								<resource-ref>
							 | 
						||
| 
								 | 
							
								 <description>postgreSQL Datasource example</description>
							 | 
						||
| 
								 | 
							
								 <res-ref-name>jdbc/postgres</res-ref-name>
							 | 
						||
| 
								 | 
							
								 <res-type>javax.sql.DataSource</res-type>
							 | 
						||
| 
								 | 
							
								 <res-auth>Container</res-auth>
							 | 
						||
| 
								 | 
							
								</resource-ref>
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<h4>4. Accessing the datasource</h4>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								When accessing the datasource programmatically, remember to prepend
							 | 
						||
| 
								 | 
							
								<code>java:/comp/env</code> to your JNDI lookup, as in the following snippet of
							 | 
						||
| 
								 | 
							
								code. Note also that "jdbc/postgres" can be replaced with any value you prefer, provided
							 | 
						||
| 
								 | 
							
								you change it in the above resource definition file as well.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								InitialContext cxt = new InitialContext();
							 | 
						||
| 
								 | 
							
								if ( cxt == null ) {
							 | 
						||
| 
								 | 
							
								   throw new Exception("Uh oh -- no context!");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/postgres" );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if ( ds == null ) {
							 | 
						||
| 
								 | 
							
								   throw new Exception("Data source not found!");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table>
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Non-DBCP Solutions"><strong>Non-DBCP Solutions</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								These solutions either utilise a single connection to the database (not recommended for anything other
							 | 
						||
| 
								 | 
							
								than testing!) or some other pooling technology.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Oracle 8i with OCI client"><strong>Oracle 8i with OCI client</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Introduction"><strong>Introduction</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<p>Whilst not strictly addressing the creation of a JNDI DataSource using the OCI client, these notes can be combined with the
							 | 
						||
| 
								 | 
							
								Oracle and DBCP solution above.</p>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								In order to use OCI driver, you should have an Oracle client installed. You should have installed
							 | 
						||
| 
								 | 
							
								Oracle8i(8.1.7) client from cd,  and download the suitable JDBC/OCI
							 | 
						||
| 
								 | 
							
								driver(Oracle8i 8.1.7.1 JDBC/OCI Driver) from <a href="http://otn.oracle.com/">otn.oracle.com</a>. 
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								After renaming <code>classes12.zip</code> file to <code>classes12.jar</code>
							 | 
						||
| 
								 | 
							
								for Tomcat, copy it into <code>$CATALINA_HOME/lib</code>. 
							 | 
						||
| 
								 | 
							
								You may also have to remove the <code>javax.sql.*</code> classes
							 | 
						||
| 
								 | 
							
								from this file depending upon the version of Tomcat and JDK you are using.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Putting it all together"><strong>Putting it all together</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Ensure that you have the <code>ocijdbc8.dll</code> or <code>.so</code> in your <code>$PATH</code> or <code>LD_LIBRARY_PATH</code>
							 | 
						||
| 
								 | 
							
								 (possibly in <code>$ORAHOME\bin</code>) and also confirm that the native library can be loaded by a simple test program 
							 | 
						||
| 
								 | 
							
								using <code>System.loadLibrary("ocijdbc8");</code>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								You should next create a simple test servlet or jsp that has these
							 | 
						||
| 
								 | 
							
								<strong>critical lines</strong>:
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
							 | 
						||
| 
								 | 
							
								DriverManager.registerDriver(new
							 | 
						||
| 
								 | 
							
								oracle.jdbc.driver.OracleDriver());
							 | 
						||
| 
								 | 
							
								conn =
							 | 
						||
| 
								 | 
							
								DriverManager.getConnection("jdbc:oracle:oci8:@database","username","password");
							 | 
						||
| 
								 | 
							
								</pre></td><td bgcolor="#023264" width="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="./images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								where database is of the form <code>host:port:SID</code> Now if you try to access the URL of your 
							 | 
						||
| 
								 | 
							
								test servlet/jsp and what you get is a 
							 | 
						||
| 
								 | 
							
								<code>ServletException</code> with a root cause of <code>java.lang.UnsatisfiedLinkError:get_env_handle</code>.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								First, the <code>UnsatisfiedLinkError</code> indicates that you have 
							 | 
						||
| 
								 | 
							
								<ul>
							 | 
						||
| 
								 | 
							
								<li>a mismatch between your JDBC classes file and
							 | 
						||
| 
								 | 
							
								your Oracle client version. The giveaway here is the message stating that a needed library file cannot be
							 | 
						||
| 
								 | 
							
								found. For example, you may be using a classes12.zip file from Oracle Version 8.1.6 with a Version 8.1.5
							 | 
						||
| 
								 | 
							
								Oracle client. The classeXXXs.zip file and Oracle client software versions must match.
							 | 
						||
| 
								 | 
							
								</li>
							 | 
						||
| 
								 | 
							
								<li>A <code>$PATH</code>, <code>LD_LIBRARY_PATH</code> problem.</li>
							 | 
						||
| 
								 | 
							
								<li>It has been reported that ignoring the driver you have downloded from otn and using 
							 | 
						||
| 
								 | 
							
								the classes12.zip file from the directory <code>$ORAHOME\jdbc\lib</code> will also work.
							 | 
						||
| 
								 | 
							
								</li>
							 | 
						||
| 
								 | 
							
								</ul>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Next you may experience the error <code>ORA-06401 NETCMN: invalid driver designator</code>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								The Oracle documentation says : "Cause: The login (connect) string contains an invalid
							 | 
						||
| 
								 | 
							
								driver designator. Action: Correct the string and re-submit."
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Change the database connect string (of the form <code>host:port:SID</code>) with this one:
							 | 
						||
| 
								 | 
							
								<code>(description=(address=(host=myhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))</code>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								<i>Ed. Hmm, I don't think this is really needed if you sort out your TNSNames - but I'm not an Oracle DBA :-)</i>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table>
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Common Problems"><strong>Common Problems</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<p>Here are some common problems encountered with a web application which
							 | 
						||
| 
								 | 
							
								uses a database and tips for how to solve them.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Intermittent dB Connection Failures"><strong>Intermittent dB Connection Failures</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								Tomcat runs within a JVM.  The JVM periodically performs garbage collection
							 | 
						||
| 
								 | 
							
								(GC) to remove java objects which are no longer being used.  When the JVM
							 | 
						||
| 
								 | 
							
								performs GC execution of code within Tomcat freezes. If the maximum time
							 | 
						||
| 
								 | 
							
								configured for establishment of a dB connection is less than the amount
							 | 
						||
| 
								 | 
							
								of time garbage collection took you can get a db conneciton failure.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>To collect data on how long garbage collection is taking add the
							 | 
						||
| 
								 | 
							
								<code>-verbose:gc</code> argument to your <code>CATALINA_OPTS</code>
							 | 
						||
| 
								 | 
							
								environment variable when starting Tomcat.  When verbose gc is enabled
							 | 
						||
| 
								 | 
							
								your <code>$CATALINA_BASE/logs/catalina.out</code> log file will include
							 | 
						||
| 
								 | 
							
								data for every garbage collection including how long it took.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>When your JVM is tuned correctly 99% of the time a GC will take less
							 | 
						||
| 
								 | 
							
								than one second.  The remainder will only take a few seconds.  Rarely,
							 | 
						||
| 
								 | 
							
								if ever should a GC take more than 10 seconds.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<p>Make sure that the db connection timeout is set to 10-15 seconds.
							 | 
						||
| 
								 | 
							
								For the DBCP you set this using the parameter <code>maxWait</code>.</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Random Connection Closed Exceptions"><strong>Random Connection Closed Exceptions</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								These can occur when one request gets a db connection from the connection
							 | 
						||
| 
								 | 
							
								pool and closes it twice.  When using a connection pool, closing the
							 | 
						||
| 
								 | 
							
								connection just returns it to the pool for reuse by another request,
							 | 
						||
| 
								 | 
							
								it doesn't close the connection.  And Tomcat uses multiple threads to
							 | 
						||
| 
								 | 
							
								handle concurrent requests. Here is an example of the sequence
							 | 
						||
| 
								 | 
							
								of events which could cause this error in Tomcat:
							 | 
						||
| 
								 | 
							
								<pre>
							 | 
						||
| 
								 | 
							
								  Request 1 running in Thread 1 gets a db connection.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Request 1 closes the db connection.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  The JVM switches the running thread to Thread 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Request 2 running in Thread 2 gets a db connection
							 | 
						||
| 
								 | 
							
								  (the same db connection just closed by Request 1).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  The JVM switches the running thread back to Thread 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Request 1 closes the db connection a second time in a finally block.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  The JVM switches the running thread back to Thread 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Request 2 Thread 2 tries to use the db connection but fails
							 | 
						||
| 
								 | 
							
								  because Request 1 closed it.
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								Here is an example of properly written code to use a db connection
							 | 
						||
| 
								 | 
							
								obtained from a connection pool:
							 | 
						||
| 
								 | 
							
								<pre>
							 | 
						||
| 
								 | 
							
								  Connection conn = null;
							 | 
						||
| 
								 | 
							
								  Statement stmt = null;  // Or PreparedStatement if needed
							 | 
						||
| 
								 | 
							
								  ResultSet rs = null;
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    conn = ... get connection from connection pool ...
							 | 
						||
| 
								 | 
							
								    stmt = conn.createStatement("select ...");
							 | 
						||
| 
								 | 
							
								    rs = stmt.executeQuery();
							 | 
						||
| 
								 | 
							
								    ... iterate through the result set ...
							 | 
						||
| 
								 | 
							
								    rs.close();
							 | 
						||
| 
								 | 
							
								    rs = null;
							 | 
						||
| 
								 | 
							
								    stmt.close();
							 | 
						||
| 
								 | 
							
								    stmt = null;
							 | 
						||
| 
								 | 
							
								    conn.close(); // Return to connection pool
							 | 
						||
| 
								 | 
							
								    conn = null;  // Make sure we don't close it twice
							 | 
						||
| 
								 | 
							
								  } catch (SQLException e) {
							 | 
						||
| 
								 | 
							
								    ... deal with errors ...
							 | 
						||
| 
								 | 
							
								  } finally {
							 | 
						||
| 
								 | 
							
								    // Always make sure result sets and statements are closed,
							 | 
						||
| 
								 | 
							
								    // and the connection is returned to the pool
							 | 
						||
| 
								 | 
							
								    if (rs != null) {
							 | 
						||
| 
								 | 
							
								      try { rs.close(); } catch (SQLException e) { ; }
							 | 
						||
| 
								 | 
							
								      rs = null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (stmt != null) {
							 | 
						||
| 
								 | 
							
								      try { stmt.close(); } catch (SQLException e) { ; }
							 | 
						||
| 
								 | 
							
								      stmt = null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (conn != null) {
							 | 
						||
| 
								 | 
							
								      try { conn.close(); } catch (SQLException e) { ; }
							 | 
						||
| 
								 | 
							
								      conn = null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								</pre>
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Context versus GlobalNamingResources"><strong>Context versus GlobalNamingResources</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								  Please note that although the above instructions place the JNDI declarations in a Context
							 | 
						||
| 
								 | 
							
								  element, it is possible and sometimes desirable to place these declarations in the 
							 | 
						||
| 
								 | 
							
								  <a href="config/globalresources.html">GlobalNamingResources</a> section of the server
							 | 
						||
| 
								 | 
							
								  configuration file.  A resource placed in the GlobalNamingResources section will be shared
							 | 
						||
| 
								 | 
							
								  among the Contexts of the server.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="JNDI Resource Naming and Realm Interaction"><strong>JNDI Resource Naming and Realm Interaction</strong></a></font></td></tr><tr><td><blockquote>
							 | 
						||
| 
								 | 
							
								<p>
							 | 
						||
| 
								 | 
							
								  In order to get Realms to work, the realm must refer to the datasource as
							 | 
						||
| 
								 | 
							
								  defined in the <GlobalNamingResources> or <Context> section, not a datasource as renamed
							 | 
						||
| 
								 | 
							
								  using <ResourceLink>.
							 | 
						||
| 
								 | 
							
								</p>
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table> 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</blockquote></td></tr></table></td></tr><!--FOOTER SEPARATOR--><tr><td colspan="2"><hr noshade="noshade" size="1"></td></tr><!--PAGE FOOTER--><tr><td colspan="2"><div align="center"><font color="#525D76" size="-1"><em>
							 | 
						||
| 
								 | 
							
								        Copyright © 1999-2006, Apache Software Foundation
							 | 
						||
| 
								 | 
							
								        </em></font></div></td></tr></table></body></html>
							 |