网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  将dbms存储过程封装为会话ejb组件中的方法(2)     
  文章作者:未知  文章来源:水木森林  
  查看:106次  录入:管理员--2007-11-17  
 
  将dbms存储过程封装为会话ejb组件中的方法(2)

? ejb 组件远程接口

// enterprise javabean remote interface for analysis session bean
public interface analysis extends javax.ejb.ejbobject {
// remote interface for our lookupclient method
com.ibm.db.callablestatement lookupclient(java.lang.integer clientid)
throws java.rmi.remoteexception;
. . .
}

请注意,如果使用 visualage ejb 组件向导,则无需对此进行手工编码。替代方法是,在 bean 的实现类中对此方法编码之后,通过菜单项来将该方法提升(promote)到 bean 的远程接口,然后,将自动添加必需的代码。

编码存储过程封装器方法
现在可以集中讲述 bean 实现类本身,将在该实现类中包括调用存储过程的代码,并将其所有输出作为 com.ibm.db.callablestatement 对象返回。此代码样本包含调用 clientreport 存储过程的 lookupclient(...) 方法的完整实现。将在后续章节中详细讲解每个代码块(参考代码中的注释)的逻辑,以便您更好地理解如何为自己的存储过程实现类似的方法。

? 连接到数据库

让我们更详细地查看此代码的各部分。

在调用存储过程之前,需要建立一个到 dbms 的连接。有两种方法做得到:使用 1.0 样式的连接,或者使用 jdbc 2.0 样式的 datasource。在 websphere 环境中,通常选用后者,因为它提供连接池(connection pooling),这可以更有效地使用系统资源。出于这种原因,我们的编码模式使用 datasource。

除了确定要建立的连接类型之外,还应该考虑要将连接逻辑放在 bean 中的什么地方。有多个选择:

直接放在封装器方法(wrapper method)中
放在私有辅助方法(helper method)中
放在 ejbcreate() 方法中(并将相应的断开逻辑放在 ejbremove() 方法中)
这些方法的利弊超出了本文的范围。为简单起见,样本代码将所有连接/断开逻辑直接放在方法中。

代码块 1 显示了在使用 visualage for java 3.0.2 和 websphere 3.0.2.1 时,如何使用 datasource 进行连接。我们创建了一个散列表,在其中填充适合于 websphere 环境的值,然后建立一个 initialcontext。代码的以下几行利用该初始上下文和 java 命名和目录接口 (jndi) 服务,来获得期望的 datasource 的索引,我们以前在 websphere 中用“管理控制台”创建了该 datasource。本例中的 datasource 名为 localdb2sample。下一步,使用该 datasource 来获得一个连接,并向其传递合适的数据库用户标识和口令。从连接池获得连接之后,可以将该信息提供给 dab databaseconnection 对象,来设置它所需的连接规范。最后,将 autocommitmode 设置成 false,因为 ejb 组件负责处理事务管理服务。

测试时,在 visualage for java websphere 测试环境中运行使用 datasource 的 ejb 组件会很方便。有关如何在产品发行版 3.0.2 中这样做的指示,请参阅 david zimmerman 所著的 "creating datasources in the visualage for java websphere test environment"(在参考资料中)。

? 调用存储过程

建立了连接之后,可以集中讲述如何调用存储过程了。如封装器方法编码示例中的代码块 2 所示,首先创建一个 dab statementmetadata 对象,该对象中有存储过程的规范。下一步,定义要执行的 sql 语句。在这里将要调用 clientreport 过程,该过程需要一个输入参数(用于客户标识)和两个输出参数(用于客户名称和电子邮件地址)。下一步,将参数添加到规范中。对于每个过程参数,都指定了参数名,其数据类型及其参数模式。

代码块 3 创建即将执行的 dab callablestatement 对象。callablestatement 代表可用来执行存储过程的 sql。创建完对象之后,将其元数据设置成在代码块 2 中指定的形式。然后将 databaseconnection(在代码块 1 中创建)与该 callablestatement 关联。

下一个任务很简单:需要执行 callablestatement 对象,这将使 dbms 运行存储过程。但是,在这样做之前,必须通过 ejb 客户机应用程序,将过程的输入参数设置成传入方法的值。代码块 4 中显示了这种逻辑。

检索存储过程的输出并返回到调用程序
在封装器方法编码示例的代码块 5 中,将检索存储过程返回的输出参数。想起来了吗?这些参数代表 web 站点客户的名称和电子邮件地址。但是,不需要显式地检索存储过程返回的结果集。(这些结果集包含有关客户投资总额和公告板发表信息的数据)。您可能要问:为什么会这样呢?

某些 dbms 要求,在获得任何输出参数值之前,要从存储过程返回的结果集检索所有需要的值。由于这种要求,在通过 getparameter() 方法进行特别请求之前,callablestatement bean 不从数据库获得任何输出参数,因为何时从结果集检索数据是由用户控制的。缺省情况下,在执行存储过程之后,将自动检索结果集,并将其存储在高速缓存中。但是,必须显式检索输出参数,并将其存储在高速缓存。

检索完输出参数之后,将 dab callablestatement 返回给 ejb 组件的调用程序。该对象现在包含过程返回的所有输出(包括结果集),和帮助调用程序正确分析对象语法的适当的元数据。当我们查看调用会话 bean 封装器方法的样本客户机应用程序时,将看到如何去做。

如果您熟悉 jdbc,可能会问:为什么不在此代码块中显式发出 commit 语句。确实,如果使用的是 jdbc 1.0 样式的连接,可能需要(否则,当在 "finally" 块中关闭数据库连接时,将逆序恢复所做的工作)。但是,使用 datasource 并接受 websphere 缺省的 ejb 组件属性 (tx_required),websphere 将自动为我们的工作提供事务管理。因此,不再需要显式的 commit 语句。

处理异常与关闭打开的资源
当然,在执行会话 bean 时可能会出错。因此,需要提供异常处理。代码块 6 包括适合于与 ejb 1.0 兼容的 bean 的简单异常处理程序。它只是捕获遇到的任何异常,包括一个适当的错误消息,并将异常作为新的 remoteexception 抛回给调用程序。

另外,该代码块还包含一个 "finally" 块,以确保关闭所有打开的资源。在这里,释放任何与 callablestatement 对象关联的资源。下一步,除去在工作中所用的任何对连接的 dab 引用。最后,确保关闭 websphere 连接。

? 构建客户机应用程序

构建了 ejb 封装器方法之后,该集中讲述客户机应用程序了。与 ejb 组件一样,首先展示客户机应用程序的完整代码样本。然后,将详细讲述个别代码块。

这里显示的客户机应用程序 -- clientanalysis -- 使用 rmi/iiop 与 ejb 组件通信。其工作很简单:创建会话 bean,调用它的 lookupclient(...) 方法,处理该方法返回的 dab callablestatement 对象,然后除去 bean。将该应用程序编写成处理 callablestatement 的通用客户机,即,假设事先不知道有关 callablestatement 内部结构的任何信息。相反,我们严格依赖其中包含的元数据,来分析对象的语法,并使用其相关组件,如过程返回的输出参数和结果集。这种方法演示了通用的编码模式,可以在处理 callablestatement 的任何应用程序中使用。就这样,它补充了在无状态会话 ejb 组件中对封装存储过程所用的通用编码模式。

? 创建 ejb 组件并调用其封装器方法

客户机应用程序的代码块 1 以 main(...) 方法开始。它指定感兴趣的客户标识,并调用一个私有辅助方法,来获得正在使用的会话 ejb 组件。执行完 bean 之后,调用 lookupclient(...) 方法。这是封装 clientreport 存储过程并返回 dab callablestatement 的方法。

需要详细讲述私有辅助方法 -- createejb()。因为 ejb 组件创建工作可能会根据所用的 web 应用程序而略有不同,所以,选择将这个工作隔离成单独的方法。特别是,由于与该上下文相关的特定属性将会改变,所以,获得 jndi initialcontext 的方法可能不同。

该 createejb() 方法创建一个散列表,然后用适合于软件环境的值填充。下一步,创建一个新的 initialcontext 对象,该对象用于通过 jndi 服务获得对 ejb 组件的远程引用。因为从 jndi 上下文返回 jndi(这是在 iiop 之上使用 rmi 的编码需求),所以,限制了该远程引用。获得 ejb 组件宿主之后,创建一个无状态会话 bean,然后将其返回给客户机应用程序的 main 方法。

? 处理返回的对象

客户机应用程序的代码块 2 处理 ejb 组件返回的 dab callablestatement 对象。首先定位与 callablestatement 关联的根元数据对象。因为 callablestatements 可以获得多个结果集,所以,多个 statementmetadata 对象可以链接在一起,并包括在 callablestatement 中。而链的根总包含描述 sql 语句的元数据和相关参数,因此,这就是我们的开始之处。这允许我们获得 callablestatement 中包括的参数数目。返回的数目将包括过程的所有 in、inout 和 out 参数。通过使用循环,可以处理所有参数并打印每个参数的相关信息,包括参数名、相应的 java 类和模式(指明 in、inout 或 out 模式的数字)。

下一步,查看结果集并处理它们。首先,确定 callablestatement 对象中包括的结果集数目。通过使用循环,可以获得每个用 dab selectresult 对象表示的结果集。然后,使用另一个私有辅助方法 processrs(...) 来处理结果集。processrs(...) 方法确定传递给 selectresult 并包含在其中的行和列的数目。假设有一些行存在,它使用嵌套循
 
 
上一篇: 将 java 小程序迁移到 microsoft j# 浏览器控件    下一篇: 将数据库操作封装到javabean
  相关文档
java 从老虎变野马?好事还是坏事? 11-17
j2se中的序列化详解(一) 11-16
jdbc连接sql2000详细流程 11-17
编写可在线收发e-mail的java applet 11-17
一个新的berkeley db java 持久api 11-17
pda操作系统大比拼之二 11-17
this 语句 11-16
ubuntu 上利用 subclipse 访问 svn 11-17
改进java字符串分解的方法 11-17
java安全:java非对称加密源代码(rsa) 02-03
java语--hibernate中各个包的作用简介 01-29
用actionform一次获取表单所有参数 11-17
用javabean实现多个文件上传的两种方法 11-16
java基础入门之文件操作 11-17
java多线程的优先级 11-17
经典java开发工具介绍(1):oracle internet developer 11-17
ramdom的应用 11-17
java一点通:中文识别问题全解决办法 11-16
用eclipse3.0+jboss4lomboz 3开发j2ee 11-17
我们在定义常量的时候,可以把常量定义在接口里面,如: 12-27
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息