The following instructions are based on the instructions for Tomcat-5.x, available at http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html which is current at the time this document was written.
First, install the .jar
file that comes with
Connector/J in $CATALINA_HOME/common/lib
so
that it is available to all applications installed in the
container.
Next, configure the JNDI DataSource by adding a declaration
resource to $CATALINA_HOME/conf/server.xml
in
the context that defines your web application:
<Context ....> ... <Resource name="jdbc/MySQLDB" auth="Container" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/MySQLDB"> <parameter> <name>factory</name> <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> </parameter> <parameter> <name>maxActive</name> <value>10</value> </parameter> <parameter> <name>maxIdle</name> <value>5</value> </parameter> <parameter> <name>validationQuery</name> <value>SELECT 1</value> </parameter> <parameter> <name>testOnBorrow</name> <value>true</value> </parameter> <parameter> <name>testWhileIdle</name> <value>true</value> </parameter> <parameter> <name>timeBetweenEvictionRunsMillis</name> <value>10000</value> </parameter> <parameter> <name>minEvictableIdleTimeMillis</name> <value>60000</value> </parameter> <parameter> <name>username</name> <value>someuser</value> </parameter> <parameter> <name>password</name> <value>somepass</value> </parameter> <parameter> <name>driverClassName</name> <value>com.mysql.jdbc.Driver</value> </parameter> <parameter> <name>url</name> <value>jdbc:mysql://localhost:3306/test</value> </parameter> </ResourceParams> </Context>
Note that Connector/J 5.1.3 introduced a facility whereby, rather
than use a validationQuery
value of
SELECT 1
, it is possible to use
validationQuery
with a value set to /*
ping */
. This sends a ping to the server which then
returns a fake result set. This is a lighter weight solution. It
also has the advantage that if using
ReplicationConnection
or
LoadBalancedConnection
type connections, the
ping will be sent across all active connections. The following XML
snippet illustrates how to select this option:
<parameter> <name>validationQuery</name> <value>/* ping */</value> </parameter>
Note that /* ping */
has to be specified
exactly.
In general, follow the installation instructions that come with your version of Tomcat, as the way you configure datasources in Tomcat changes from time to time, and if you use the wrong syntax in your XML file, you will most likely end up with an exception similar to the following:
Error: java.sql.SQLException: Cannot load JDBC driver class 'null ' SQL state: null
Note that the auto-loading of drivers having the
META-INF/service/java.sql.Driver
class in
JDBC 4.0 and above causes an improper undeployment of the
Connector/J driver in Tomcat on Windows. Namely, the Connector/J
jar remains locked. This is an initialization problem that is not
related to the driver. The possible workarounds, if viable, are as
follows: use "antiResourceLocking=true
" as a
Tomcat Context attribute, or remove the
META-INF/
directory.