%--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
This page talks about how to use the database pool ${pool.name} from a J2EE application. The example here is a web application, but other application modules would work in the same way.
WEB-INF/web.xml
The web.xml should have a resource-ref section declaring the database pool, like this. Note the res-ref-name, which is what we'll need to map the reference to a pool, and also what the application will need in order to access the pool.
<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"> <!-- servlets and mappings and normal web.xml stuff here --> <resource-ref> <res-ref-name>jdbc/MyDataSource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> </web-app>
WEB-INF/geronimo-web.xml
To point the resource reference to a specific database pool in Gernimo, the web application needs to have a geronimo-web.xml deployment plan. That may be packaged in the WAR in the WEB-INF directory, or it may be provided separately on the command line to the deploy tool. The geronimo-web.xml plan should have a dependency element pointing to the database pool module, and a resource-ref block corresponding to the web.xml resource-ref above, which maps the resource reference to a specific database pool. In that block, the ref-name must match the res-ref-name from the web.xml (above) and the resource-link must point to the database pool by name.
If you have only one pool named ${pool.name} deployed in Geronimo, you can point to it like this.
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1"> <environment> <moduleId> <artifactId>MyWebApp</artifactId> </moduleId> <dependencies> <dependency> <groupId>${pool.abstractNameMap['groupId']}</groupId> <artifactId>${pool.abstractNameMap['artifactId']}</artifactId> </dependency> </dependencies> </environment> <context-root>/MyWebApp</context-root> <!-- security settings, if any, go here --> <resource-ref> <ref-name>jdbc/MyDataSource</ref-name> <resource-link>${pool.name}</resource-link> </resource-ref> </web-app>
That will search for a pool named ${pool.name} in the current application and any modules listed as dependencies (and their dependencies, etc.).
If you have more than one pool named ${pool.name} (for example, two dependencies that each include a component named ${pool.name}), then you can specify the pool to use more explicitly like this:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1"> <environment> <moduleId> <artifactId>MyWebApp</artifactId> </moduleId> <dependencies> <dependency> <groupId>${pool.abstractNameMap['groupId']}</groupId> <artifactId>${pool.abstractNameMap['artifactId']}</artifactId> </dependency> </dependencies> </environment> <context-root>/MyWebApp</context-root> <!-- security settings, if any, go here --> <resource-ref> <ref-name>jdbc/MyDataSource</ref-name> <pattern> <groupId>${pool.abstractNameMap['groupId']}</groupId> <artifactId>${pool.abstractNameMap['artifactId']}</artifactId> <name>${pool.abstractNameMap['name']}</name> </pattern> </resource-ref> </web-app>
Application Code
To get a reference to the database pool, your application can use code like this. Note that the JNDI lookup string is java:comp/env/ plus the res-ref-name used in web.xml (above).
protected void doGet(HttpServletRequest request, HttpServletResponse response) { try { InitialContext ctx = new InitialContext(); DataSource ds = ctx.lookup("java:comp/env/jdbc/MyDataSource"); Connection con = ds.getConnection(); } catch(NamingException e) { ... } catch(SQLException e) { ... } }