首页 / 软件开发 / JAVA / 将存储过程封装为EJB组件的方法
将存储过程封装为EJB组件的方法2010-09-28集成 Web 应用服务器和数据库管理 (DBMS) 技术是很多新型商业应用的常见需求。在本文中,我们将讨论该集成的一个方面:如何在会话 Enterprise JavaBeans (EJB) 组件中设计与开发封装或调用现有 DBMS 存储过程的方法。您应该熟悉 EJB 技术、结构化查询语言 (SQL) 和 Java 数据库连接 (JDBC) 的基本知识,以便充分理解本文。如果您正致力于需要访问或修改在 DMBS 中数据的 Web 应用程序开发,那么可能已经在向基于 EJB 的设计转移。您可能会发现,通过使会话 EJB 组件利用 DBMS 存储过程,可以减少编码和维护工作,并可能提高数据访问性能。一些公司多年来一直在使用存储过程(stored procedure),很大程度上是因为它们可以帮助减少网络通信量,并提高分布式计算环境中的性能。通常,这些过程包含涉及多数据库操作的重要业务逻辑。远程应用程序调用这些过程,在 DMBS 服务器上执行它们所包含的 SQL 语句。当然,过程结束时,所有结果都返回给应用程序。这些旧有存储过程对 Web 应用通常是有用的。与其在 EJB 组件中复制这些逻辑,为什么不将这些过程作为方法封装在会话 bean 中呢?这样可以避免 DBMS 服务器和 EJB 组件中的冗余代码 -- 在考虑开发、调试和维护开销时,冗余代码将损耗开发效率。这还可能带来提高性能的好处。调用存储过程可以减少 EJB 组件原本不得不发出的 SQL 语句数量,从而减少与远程 DBMS 的通信开销。入门现在明白为什么要从会话 bean 调用存储过程了吧,下面我们看看如何开始。首先,需要使用适当的开发环境,该环境应该包括一个带有内置 EJB 支持的 Java 开发工具,一个 Web 应用服务器和一个关系 DBMS。我的参考配置包括 VisualAge for Java 企业版 3.0.2,WebSphere Application Server 高级版 3.0.2.1,以及 DB2 V7.1,所有这些都安装在一个 Windows NT 系统上。有关如何配置该环境以支持本文所述工作的详细信息,请参阅 "Leveraging DBMS Stored Procedures through Enterprise JavaBeans"(位于参考资料中)或参考产品手册。有了正确的软件环境,就可以开始了。虽然我们要讨论的编码模式可能适合于无状态会话(stateless session) bean,但它也可使用有状态会话(stateful session) bean 组件。但是,因为无状态会话 bean 比有状态会话 bean 消耗的系统资源更少,而且涉及的代码也更少,所以通常建议使用无状态会话 bean。首先要考虑的设计问题是如何在存储过程和 EJB 组件之间映射数据。存储过程可能需要多个输入、输出和输入/输出参数,并返回一个或多个结果集(代表数据行)。除非要对不同类型的过程使用不同的编码模式,您需要编写 EJB 组件以便处理所有这些可能性。处理输入(或者输入/输出)参数很简单:将存储过程需要的每个参数映射成 EJB 组件的输入参数。但是,处理存储过程的输出比较棘手。可能有多个输出参数和多个结果集要传回调用程序,需要将这些作为一个可序列化的对象返回,以符合 EJB 规范。可以编写自己的类,使其可以将这些数据打包成一个对象,并在该对象中包括所有必须的元数据。(该元数据将描述对象的内部结构,以便客户机知道如何处理。)但这需要大量工作。如果正在使用 VisualAge for Java 和 WebSphere,那么,有个更好的选项:使用它们的数据访问 Bean (DAB) 库。该库包含一些提供位于基本 JDBC 之上的函数层的类。可能会发现 com.ibm.db.CallableStatement 类特别方便,因为它允许创建一个可序列化的对象,该对象包含所有从存储过程返回的输出,包括多个结果集(如果有的话)和相关元数据。还有一个好处是,该库设计成可以支持任何支持 JDBC 的数据源,因此,它可以使 bean“与 DBMS 无关”。有了 DAB 库,就可以用一个编码模式在会话 EJB 组件中封装任何存储过程。甚至可以在 EJB 客户机中使用一个通用的编码模式,来处理任何从封装器方法返回的结果。回顾开发任务我们来讨论一下使用通用编码模式,来集成 EJB 组件和 DBMS 存储过程的步骤:确定要将哪个存储过程封装成 EJB 方法。如果该过程不存在,则遵循 DBMS 标准过程来创建和调试。确定要使用哪个无状态会话 EJB 组件。如果该 EJB 不存在,则遵循 Java 开发环境的标准过程来创建和调试。扩展 EJB 组件的远程接口,以包括用于封装存储过程的新方法。扩展 EJB 组件的实现,以包括封装存储过程的新方法的逻辑。连接到数据库、调用存储过程、处理所有结果集和处理所有异常是后面要解决的问题。通过构建一个客户机应用或 Servlet,来调用 EJB 组件封装器方法,以测试所做的工作。头两项是基本编程任务,您可能已经熟悉。根据所用产品的不同,个别步骤可能会略有不同,但是大多数产品都有工具来提供帮助。例如,如果正在使用 VisualAge for Java 和 DB2,则可以利用“存储过程构建器”来完成步骤 1,以及利用 EJB 开发特性来完成步骤 2。本文将不集中讲述头两步。但是,其余三步需要详细讲解。本文将在一个实际示例的环境下讨论这些步骤中的每一步。