How to Setup Global JNDI Mapping
|
| by Gregg Lagnese, MicroDeveloper, Inc. |
| May 16, 2005 v1.3 |
Steps to Implement: |
| 1) Modify the server.xml file |
| In <CATALINA_HOME>/conf/server.xml between <GlobalNamingResources> and </GlobalNamingResources> add the following |
<Resource name="jdbc/<alias>" auth="Container" type="oracle.jdbc.pool.OracleDataSource" driverClassName="oracle.jdbc.driver.OracleDriver" factory="oracle.jdbc.pool.OracleDataSourceFactory" url="jdbc:oracle:thin:@<host>:<port>:<sid>" [user=<user>] [password=<password>] maxActive="20" maxIdle="10" maxWait="-1" /> |
Example |
<!-- Global JNDI resources --> <GlobalNamingResources> <!-- Test entry for demonstration purposes --> <Environment name="simpleValue" type="java.lang.Integer" value="30"/> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> <!-- Every connection to 'db1' uses the same user --> <Resource name="jdbc/db1" auth="Container" type="oracle.jdbc.pool.OracleDataSource" driverClassName="oracle.jdbc.driver.OracleDriver" factory="oracle.jdbc.pool.OracleDataSourceFactory" url="jdbc:oracle:thin:@oracle.microdeveloper.com:1521:db1" user="scott" password="tiger" maxActive="20" maxIdle="10" maxWait="-1" /> <!-- Every connection to 'db2' must provide a username and password --> <Resource name="jdbc/db2" auth="Container" type="oracle.jdbc.pool.OracleDataSource" driverClassName="oracle.jdbc.driver.OracleDriver" factory="oracle.jdbc.pool.OracleDataSourceFactory" url="jdbc:oracle:thin:@oracle.microdeveloper.com:1521:db2" maxActive="20" maxIdle="10" maxWait="-1" /> </GlobalNamingResources> |
| 2) Modify the context.xml file |
| In <CATALINA_HOME>/conf/context.xml between <Context> and </Context> add the following for each entry in the JNDI resource list: |
| <ResourceLink global="jdbc/<alias>" name="jdbc/<alias>" type="oracle.jdbc.pool.OracleDataSource"/> |
Example |
<!-- The contents of this file will be loaded for each web application --> <Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>META-INF/context.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <ResourceLink global="jdbc/db1" name="jdbc/db1" type="oracle.jdbc.pool.OracleDataSource"/> <ResourceLink global="jdbc/db2" name="jdbc/db2" type="oracle.jdbc.pool.OracleDataSource"/> </Context> |
| 3) Modify the context's web.xml file (5.0.x step only - not necessary for 5.5.x) |
| In the <CONTEXT>/WEB-INF/web.xml between <web-app> and </web-app> add the following: |
<resource-ref> <description><Your Description></description> <res-ref-name>jdbc/<alias></res-ref-name> <res-type>oracle.jdbc.pool.OracleDataSource</res-type> <res-auth>Container</res-auth> </resource-ref> |
Example |
<resource-ref> <description>Oracle Development Datasource</description> <res-ref-name>jdbc/db1</res-ref-name> <res-type>oracle.jdbc.pool.OracleDataSource</res-type> <res-auth>Container</res-auth> </resource-ref> <resource-ref> <description>Oracle Development Datasource</description> <res-ref-name>jdbc/db2</res-ref-name> <res-type>oracle.jdbc.pool.OracleDataSource</res-type> <res-auth>Container</res-auth> </resource-ref> |
| 4) Restart Tomcat |
Testing the Changes |
| 5) Create a connection class (in the example it will be called ConnectionPool.java) |
package com.microdeveloper.db.jndi; import oracle.jdbc.pool.OracleDataSource; import javax.naming.Context; import javax.naming.InitialContext; import java.io.Serializable; import java.sql.Connection; public class ConnectionPool implements Serializable {
String message = "Not Connected";
public void init() {
Connection conn = null;
ResultSet rst = null;
Statement stmt = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
OracleDataSource ds = (OracleDataSource) envContext.lookup("jdbc/db1");
if (envContext == null) throw new Exception("Error: No Context");
if (ds == null) throw new Exception("Error: No DataSource");
if (ds != null) conn = ds.getConnection();
if (conn != null) {
message = "Got Connection " + conn.toString() + ", ";
stmt = conn.createStatement();
rst = stmt.executeQuery("SELECT 'Success obtaining connection' FROM DUAL");
}
if (rst.next()) message = rst.getString(1);
rst.close();
rst = null;
stmt.close();
stmt = null;
conn.close(); // Return to connection pool
conn = null; // Make sure we don't close it twice
} catch (Exception e) {
e.printStackTrace();
} finally {
// Always make sure result sets and statements are closed,
// and the connection is returned to the pool
if (rst != null) {
try {
rst.close();
} catch (SQLException e) {;}
rst = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {;}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {;}
conn = null;
}
}
}
public String getMessage() {return message;}
} |
| 6) Create a JSP page to test with: |
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head><title>JSP Page</title></head> <body> <% com.microdeveloper.db.jndi.ConnectionPool ocp = new com.microdeveloper.db.jndi.ConnectionPool(); ocp.init(); %> <h2>Results</h2> Message: <%= ocp.getMessage() %> </body> </html> |
| 7) Compile the class and deploy the context |
| Either manually or through your IDE, compile the class, then deploy the context to Tomcat. Now run the JSP page created in step 6. You should see the following: |
ResultsMessage: Success obtaining connection |