级别: 中级 Emilio F Zegarra (ezegarra@us.ibm.com), 软件工程师,Business Partner Technical Enablement, IBM
2006 年 3 月 20 日 Apache Geronimo 是部署 Java™ 2 Platform, Enterprise Edition (J2EE) 应用程序的一个新的很受欢迎的替代方案。IBM DB2® 是一个成熟的关系数据库产品,非常适用于 J2EE 环境。IBM 软件工程师 Emilio Zegarra 将详细介绍如何将这两个产品集成到 J2EE 应用程序中。学习如何开发和部署连接到 DB2 数据库的应用程序,并获得设置环境所需的配置文件。了解如何使用 Eclipse 和 Web 工具平台 (WTP) 插件项目组合应用程序所需的不同组件,最后,将学习如何部署应用程序和 DB2 配置。
概述:Apache Geronimo
Apache Geronimo 项目成功构建了一个开源的、J2EE 兼容的应用服务器。该应用服务器非常强大可靠,这得益于它将一些现有的开源项目重新使用,作为其实现的一部分。从某种意义上说,Apache Geronimo 应用服务器是几个开放源码项目的集合。例如,表 1 提供了组成 Apache Geronimo 的一些开放源码项目的列表。
表 1. Apache Geronimo 中的主要开放源码项目
| 技术 | 开放源码项目 |
|---|
| Enterprise JavaBeans (EJB) 容器 | Open EJB | | Web 容器 | Jetty, Tomcat | | Java Messaging Service (JMS) 消息传递 | Active MQ | | Lightweight Directory Access Protocol (LDAP) | Apache Directory |
以下产品用于示例应用程序的开发或部署:
- Apache Geronimo Application Server, Version 1.0(请参阅 参考资料,从中获得下载信息)
- IBM DB2 Universal Database™, Version 8.2
- Eclipse, Version 3.1(可选)
- Eclipse Web Tools Platform 插件项目的 0.7.1 版(可选)
关于示例应用程序
本文中使用的示例应用程序是一个具有已定义的 JavaServer Pages (JSP) 的 Web 模块应用程序,用于演示 DB2 与 Apache Geronimo 的集成。该 JSP(名为 references.jsp)将查询数据库中可用的 Apache Geronimo 引用的表,如 图 1 中所示。
图 1. 应用程序概述
当 JSP 从数据库中获得数据之后,它将以制表形式将此数据展示给请求客户机。在为服务器部署应用程序之前,必须完成数据库配置。为了实现这一点,需要制定一个数据库部署计划。然后使用此部署计划,在用于将要使用的应用程序的 Apache Geronimo 服务器上部署 DB2 数据源定义。
设置开发环境
要开发应用程序和资源,则需要使用 Eclipse 集成式开发环境 (Eclipse Integrated Development Environment, IDE) 工具。要构建应用程序,则需要使用 WTP 插件。此插件使文件编辑变得又快又容易。(关于下载和安装 Eclipse, Version 3.1 和 WTP 的指令,请参阅 参考资料。)
对于本文,可以使用 0.7.1 版的 WTP 和 3.1 版的 Eclipse。如果不喜欢安装这些产品,可以使用您所喜爱的 IDE 来构建这些资源。不过,描述如何构建资源的章节假定您安装了这些产品。
Geronimo 部署计划
J2EE 应用程序不提供在 J2EE 平台中实现所有这些组件的细节。因此,J2EE 服务器供应商必须提供自己的应对解决方案,使自己不被这些规范所束缚。Apache Geronimo 团队使用部署计划来应对这些限制,并向服务器提供有关服务器上已配置资源的信息。要获得有关组成部署计划的、可在 %GERONIMO_HOME%/schema 文件夹中使用的元素的细节信息,请参阅提供的不同 XML 方案。
步骤 1:定义数据源
在连接到数据源之前,需要向 Geronimo 提供 Java Database Connectivity (JDBC) 驱动程序。位于 %GERONIMO_HOME% 文件夹中的 repository 文件夹用于向服务器提供库。将资源库添加到储存库是一个由三个步骤组成的过程。
- 使用库的名称创建一个新的文件夹,并在该文件夹下定义一个
jars 文件夹。
- 将库复制到 jars 文件夹。
- 提供一个库版本号。这一步可以通过只重新命名库文件来实现。
在我们的示例中,连接到 DB2 的 JDBC 驱动程序将使用三个 .jar 文件。在复制库之后,将数据库服务器的版本号追加到其名称后面。因此,物理储存库的定义看起来与 图 2 类似。
图 2. DB2 JDBC 驱动程序储存库的定义
在已经将这些库添加到运行库中之后,为 DB2 数据源制订一个部署计划,如 清单 1 中所示。注意,从属条目指 repository 文件夹下定义的 JDBC 驱动程序库。这里有几个文件,需要为每个文件提供一个条目。此外,configId 参数提供了一个用于 DB2 数据源的名称。在将 Web 模块映射到此数据源时,将使用此名称。
清单 1. DB2 数据源部署计划
<?xml version="1.0"?>
<connector xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector-1.0"
version="1.5" configId="DB2Database">
<dependency>
<uri>db2/db2jcc/8.1.7/jar</uri>
</dependency>
<dependency>
<uri>db2/db2jcc_license_cisuz/8.1.7/jar</uri>
</dependency>
<dependency>
<uri>db2/db2jcc_license_cu/8.1.7/jar</uri>
</dependency>
<resourceadapter>
<outbound-resourceadapter>
<connection-definition>
<connectionfactory-interface>
javax.sql.DataSource
</connectionfactory-interface>
<connectiondefinition-instance>
<name>DB2Database</name>
<config-property-setting name="UserName">
system
</config-property-setting>
<config-property-setting name="Password">
manager
</config-property-setting>
<config-property-setting name="Driver">
com.ibm.db2.jcc.DB2Driver
</config-property-setting>
<config-property-setting name="ConnectionURL">
jdbc:db2://peru.pittsburgh.ibm.com:50000/db2
</config-property-setting>
<config-property-setting name="CommitBeforeAutocommit">
true
</config-property-setting>
<config-property-setting name="ExceptionSorterClass">
org.tranql.connector.NoExceptionsAreFatalSorter
</config-property-setting>
<connectionmanager>
<local-transaction />
<single-pool>
<max-size>10</max-size>
<min-size>0</min-size>
<blocking-timeout-milliseconds>
5000
</blocking-timeout-milliseconds>
<idle-timeout-minutes>
30
</idle-timeout-minutes>
<match-one />
</single-pool>
</connectionmanager>
</connectiondefinition-instance>
</connection-definition>
</outbound-resourceadapter>
</resourceadapter>
</connector>
|
要为数据源创建部署计划,则需要使用 Eclipse 的 XML 编辑功能:
- 通过选择 File > New > Project,创建一个用来保存部署计划文件的项目。
- 输入
DeploymentPlans 作为项目名称并单击 Finish。
- 通过选择 File > New > File,然后选择 DeploymentPlans 作为父文件夹,并输入
db2-plan.xml 作为文件名,创建用来定义数据源的部署计划文件。
- 单击 Finish。
- 当编辑器打开时,剪切 清单 1 的内容并将它粘贴到编辑器中。
- 选择 File > Save 来保存文件。
- 导出此部署计划,以便以后为某一服务器部署该计划。在 Project Explorer 视图中展开 Other Projects >
DeploymentPlans 并选择 db2-plan.xml。
- 右击该文件,然后选择 Export > File System > Next。
- 在 To Directory 字段中输入
%GERONIMO_HOME%/plans。如果 plans 目录不存在,则创建该目录。
- 单击 Finish。
现在已经为 DB2 数据源创建了部署计划并准备安装它。不过,在继续后面的操作之前,需要构建应用程序,以便能够同时部署所有事情。
步骤 2:创建 Web 模块应用程序
要使用 DB2 数据源连接,则必须开发一个由简单的 JSP 组成的 Web 模块。该 JSP 文件将查询 DB2 数据源并获得可用引用的列表,以了解有关 Geronimo 应用服务器的更多信息。在从数据源中获得该列表之后,该列表将以制表形式显示数据。
- 创建 Web 模块:
- 选择 File > New > Project。
- 展开 Web 文件夹,然后选择 Dynamic Web Project 并单击 Next。
- 输入
GeronimoReferences 作为名称并单击 Finish。
- 创建 JSP:
- 选择 File > New > Other。
- 展开 Web 文件夹,然后选择 JSP 并单击 Next。
- 输入
references.jsp 作为文件名。
- 选择 GeronimoReferences/WebContent 作为父文件夹。
- 单击 Next。
- 取消对 Use JSP Template 的选定并单击 Finish。
- 当用于 references.jsp 的编辑器打开时,输入 清单 2 中所示代码。
JSP 文件首先查找一个数据源,然后创建一个新的连接。在创建连接之后,将创建一条语句并执行一个查询。然后某一表将在 JSP 中显示查询的结果。
清单 2. references.jsp 的内容
<HTML>
<HEAD>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
import="java.sql.*,javax.sql.*,javax.naming.*;"%>
<%
DataSource ds = null;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
Context ctx = null;
String query = "SELECT REFNAME, REFURL FROM REFERENCES";
ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myds");
conn = ds.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(query);
%>
<TITLE>Geronimo References</TITLE>
</HEAD>
<BODY>
<H2>Geronimo References</H2>
<P>List of sites with information about the Geronimo Application Server.</P>
<TABLE border="1">
<TR>
<TH>Title</TH>
<TH>URL</TH>
</TR>
<%while (rs.next()) {%>
<TR>
<TD><%=rs.getString(1)%></TD>
<TD><%=rs.getString(2)%></TD>
</TR>
<%}
rs.close();
stmt.close();
conn.close();%>
</TABLE>
</BODY>
</HTML>
|
- 更新 Web 部署描述符,并添加用于数据源的资源引用:
- 转换到 J2EE 透视图。
- 在 Project Explorer 视图中展开 Dynamic Web Projects > Geronimo References,并双击 Geronimo References。这将打开 Web 模块的部署描述符。
- 在 清单 2 的 JSP 代码中,访问数据源是通过查找资源引用来执行的。资源引用必须在应用程序的部署描述符中定义。使用 清单 3 中所示的资源引用定义来更新部署描述符。
清单 3. 指定 Web 模块部署描述符 WEB-INF/web.xml 中的数据源资源引用
<resource-ref>
<description />
<res-ref-name>jdbc/myds</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
|
- 将资源引用绑定到部署的数据源。
要告诉 Geronimo 应用服务器如何将资源引用绑定到部署的资源,则需要使用 Geronimo 部署计划。每种模块类型和应用程序都有一个部署计划。对于 Web 模块,部署计划的名称是 geronimo-web.xml。除了标准部署描述符之外,还需要在将应用程序部署到服务器时提供一个 Geronimo 部署计划。要创建部署计划,请执行以下这些步骤:
- 选择 File > New > File。
- 选择 Geronimo References > Web Content > WEB-INF 作为父文件夹,并输入
geronimo-web.xml 作为文件名。
- 输入 清单 4 中所示内容。
清单 4. Geronimo 的 Web 模块部署描述符 WEB-INF/geronimo-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/web"
xmlns:naming="http://geronimo.apache.org/xml/ns/naming"
configId="com/ibm/samples/GeronimoReferences.war"
parentId="DB2Database">
<context-root>/GeronimoReferences</context-root>
<naming:resource-ref>
<naming:ref-name>jdbc/myds</naming:ref-name>
<naming:resource-link>DB2Database</naming:resource-link>
</naming:resource-ref>
</web-app>
|
Geronimo 的 Web 部署计划允许将 Web 部署描述符中定义的数据源资源引用绑定到服务器中定义的数据源资源。在为数据源创建部署计划时,为该数据源分配了一个配置 ID。提供给数据源的配置 ID 是确定资源引用与资源本身之间的映射关系的 ID。
- 导出 Web 模块应用程序。
- 在已经定义所有资源之后,必须导出 Web 应用程序,以便在服务器上部署它。在 Project Explorer 视图中右击 Dynamic Web Projects > GeronimoReferences,然后选择 Export。
- 选择 WAR File 并单击 Next。
- 选择 GeronimoReferences 作为 Web 模块,浏览到 %GERONIMO_HOME%/applications/GeronimoReferences.war 作为目的地,并单击 Finish。
现在已经为给服务器部署应用程序和 DB2 部署计划做好了准备。
步骤 3:创建测试数据库
要创建测试数据库,则需要打开 DB2 命令窗口并填充数据库。要做到这一点,请执行 清单 5 中所示命令。
清单 5. 创建 DB2 测试表
>db2 connect to SAS user wcc\peru
Enter current password for wcc\peru:
Database Connection Information
Database server = DB2/NT 8.2.0
SQL authorization ID = PERU
Local database alias = SAS
>db2 create table peru.references (refid varchar(10) primary key not null, \
refname varchar(50), refurl varchar(150))
DB20000I The SQL command completed successfully.
>db2 insert into peru.references (refid, refname, refurl) \
values ('0', 'Apache Geronimo', 'http://geronimo.apache.org' )
DB20000I The SQL command completed successfully.
>db2 insert into peru.references (refid, refname, refurl) \
values ('1', 'Apache Geronimo Wiki', 'http://wiki.apache.org/geronimo' )
DB20000I The SQL command completed successfully.
>db2 insert into peru.references (refid, refname, refurl) \
values ('2', 'DeveloperWorks Apache Geronimo', \
'http://www.ibm.com/developerworks.opensource/top-projects/geronimo.html' )
DB20000I The SQL command completed successfully.
>db2 commit
|
步骤 4:启动服务器
在开始测试并安装应用程序之前,必须启动 Apache Geronimo。要做到这一点,则需要打开 DB2 命令窗口并键入 %GERONIMO_HOME%/bin/startup。当出现 Geronimo Application Server started 消息时,可以继续进行资源部署。(注意,必须在执行命令之前设置 JAVA_HOME 指向 Sun 1.4.2_08 JDK/JRE 或高于 1.4.2 版本的副本。)
图 3. 启动 Apache Geronimo
步骤 5:部署 DB2 数据源
要部署 DB2 部署计划,则必须使用可在 Apache Geronimo 中使用的 TranQL J2EE 连接器。这一步需要使用可在 TranQL 连接器中使用的连接池。TranQL 和 .rar 文件可在 Geronimo 安装中找到,位于 repository/tranql/rars/tranql-
connector-1.1.rar 处。
要部署 DB2 部署计划,则需要键入以下所示命令。因为需要提供用户名和口令来部署应用服务器的资源,所以会用到默认用户名 system 和口令 manager。
>java -jar bin\deployer.jar --user system --password manager deploy plans\db2-plan.xml
repository\tranql\rars\tranql-connector-1.1.rar
步骤 6:部署 Web 模块应用程序
在部署 DB2 数据源之后,就准备安装应用程序。要做到这一点,则需要再次调用 Geronimo 的部署工具,并为它提供将要安装的应用程序。在这一步中,没有明确提供部署计划;不过,部署工具会在 Web 模块和特定于 Geronimo 的部署描述符(部署应用程序时创建)中找到所需的信息。要安装应用程序,请输入以下命令:
>java -jar bin\deployer.jar --user system --password manager deploy applications\GeronimoReferences.war
步骤 7:测试应用程序
在部署 DB2 数据源和 Web 模块应用程序之后,可以测试它。要做到这一点,可以打开一个浏览器窗口并输入地址 http://localhost:8080/GeronimoReferences/references.jsp。
您将收到一个类似 图 4 的响应。
图 4. 运行应用程序的结果
结束语
本文提供了Apache Geronimo 的简要介绍,并演示了如何开发和部署连接到 DB2 数据库的应用程序。您应该对如何使用、定义和部署 Apache Geronimo 应用服务器上的 DB2 资源有了一个更好的了解。此外,Eclipse 和 Web Tools Project 插件的使用将演示开放源码工具所能到达的复杂级别以及为什么使用它们,这些可能在以后的几个月中详加介绍。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Sample files | os-ag-db2ger.zip | 3KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | Emilio Zegarra 是位于 Pittsburgh, PA 的 IBM WebSphere Competency Center 的软件工程师。他感兴趣的领域包括 User Interface Design(他有一个这一方面的专利)、J2EE、自主应用程序和面向对象方面的开发。Emilio 目前正在 University of Pittsburgh 攻读计算机科学专业的博士学位。他从 University of Pittsburgh 获得了工业工程的硕士学位,并从 Carnegie Mellon University 获得信息技术和软件工程的学士学位。您可以通过 ezegarra@us.ibm.com 与 Emilio 进行联系。 |
对本文的评价
|