将存储过程封装为EJB组件的方法

1/5/2008来源:Java教程人气:5513


  集成 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 标准过程来创建和调试。