Oracle8i中CORBA组件的开发和使用本篇文章来源与时代朝阳数据库(原晓通数据库)培训部Oracle资料库。CORBA是由对象管理组织(OMG)所制订的分布式应用开发标准,Oracle8i提供了对CORBA的支持,而且开发方法及过程非常简单。本篇文章详细介绍如何开发Oracle8iCORBA应用,包括以下内容:CORBA的特征;CORBA的开发步骤;实现CORBA服务器组件实现CORBA应用使用JDeveloper开发CORBA应用。CORBA的特征CORBA表示公共对象请求代理结构(CommonObjectRequestBrokerArchitecture),它结合了最初制订该标准的各厂商的共同想法,并指定了用于调停和处理分布式对象请求的软件组件——代理(Broker)。1.指定了用于定义对象接口的语言——IDL(InterfaceDescriptionLanguage),并且该语言说明了公用的对象数据、对象可执行的操作以及例外。通过提供IDL,使得开发人员可以使用不同语言来实现CORBA组件。如下图所示:2.指定了网络协议——IIOP(InternetInter-ORBProtocol),应用开发人员在不同平台、不同操作系统之间进行跨平台开发。如下图所示:3.提供了用于处理对象请求的代理——ORB(ObjectRequestBroker),使得处理远程对象请求就象调用本地方法一样。CORBA组件的开发步骤1.编写IDL代码CORBA的关键因素是实现了语言无关性,并且语言无关性是通过定义对象到外部世界接口的元语言来完成的。IDL正是CORBA用来定义对象接口的语言,它用于说明数据、方法和例外。如下图所示:2.转换IDL代码为Java代码在编写了IDL代码之后,接下来应该将IDL代码转换为Java文件,这项任务是通过idl2java工具来完成的。如下图所示:3.实现CORBA组件在将IDL代码转换为Java代码之后,接下来就可以CORBA组件了,完成该项任务包括以下几步:编写Java代码,实现IDL中的方法。如下图所示:编译并打包组件代码。在编写了组件代码之后,编译所有Java源文件,然后打包这些代码。如下图所示:装载CORBA组件到Oracle8i数据库。在编译并打包了组件代码之后,就可以将组件代码装载到Oracle8i数据库中了,这项任务是通过loadjava工具来完成的。如下图所示:发行CORBA组件。在将CORBA组件代码装载到数据库中后,必须发行CORBA组件,然后客户应用才能访问该组件。如下图所示:在开发了CORBA组件之后,客户应用就可以访问该组件了。如下图所示:实现CORBA服务器组件下面以创建在表AUTHS上执行查询、插入、更新、删除操作的CORBA组件为例,介绍开发CORBA组件的方法。如下图所示:具体步骤如下:1.编写IDL代码,清单(author.idl):如下:moduleauthor{structAuthorInfo{stringauthor_code;stringname;unsignedshortsex;doublesalary;stringbirthdate;stringentry_date_time;};exceptionSQLError{wstringmessage;};interfaceAuthor{AuthorInfoqueryAuthor(instringauthor_code)raises(SQLError);voidinsertAuthor(inAuthorInfoinfo)raises(SQLError);voidupdateAuthor(inAuthorInfoinfo)raises(SQLError);voiddeleteAuthor(instringauthor_code)raises(SQLError);};};2.转换IDL代码为Java文件3.实现CORBA组件1)编写组件代码,程序清单如下(AuthorImpl.java):importauthor.*;importjava.sql.*;importjava.io.*;importoracle.jdbc.driver.*;publicclassAuthorImplextends_AuthorImplBase{publicAuthorInfoqueryAuthor(Stringauthor_code)throwsSQLError{/*使用try...catch语句抓取并处理例外*/try{/*创建缺省的数据库连接*/Connectionconn=newOracleDriver().defaultConnection();/*构造动态SQL语句*/Stringsql=SELECTname,sex,salary,birthdate,entry_date_time+FROMauthsWHEREauthor_code=?;/*准备动态SQL语句*/PreparedStatementps=conn.prepareStatement(sql);/*使用try...catch语句抓取并处理例外*/try{/*设置动态参数值*/ps.setString(1,author_code);/*获取并处理结果集*/ResultSetrset=ps.executeQuery();if(!rset.next())thrownewSQLError(未找到代码为+author_code+的作者!);returnnewAuthorInfo(author_code,rset.getString(1),rset.getShort(2),rset.getDouble(3),rset.getString(4),rset.getString(5));}finally{/*关闭动态SQL语句*/ps.close();}}catch(SQLExceptione){thrownewSQLError(e.getMessage());}}publicvoidinsertAuthor(AuthorInfoinfo)throwsSQLError{/*使用try...catch语句抓取并处理例外*/try{/*创建缺省的数据库连接*/Connectionconn=newOracleDriver().defaultConnection();/*构造动态SQL语句*/Stringsql=INSERTINTOauths(author_code,name,sex,salary,+birthdate,entry_date_time)VALUES(?,?,?,?,?,?);/*准备动态SQL语句*/PreparedStatementps=conn.prepareStatement(sql);/*使用try...catch语句抓取并处理例外*/try{/*设置动态参数值*/ps.setString(1,info.author_code);ps.setString(2,info.name);ps.setShort(3,info.sex);ps.setDouble(4,info.salary);ps.setString(5,info.birthdate);ps.setString(6,info.entry_date_time);/*执行动态SQL语句*/ps.executeUpdate();}finally{/*关闭动态SQL语句*/ps.close();}}catch(SQLExceptione){thrownewSQLError(e.getMessage());}}publicvoidupdateAuthor(AuthorInfoinfo)throwsSQLError{/*使用try...catch语句抓取并处理例外*/try{/*创建缺省的数据库连接*/Connectionconn=newOracleDriver().defaultConnection();/*构造动态SQL语句*/Stringsql=UPDATEauthsSETsalary=?WHEREauthor_code=?;/*准备动态SQL语句*/PreparedStatementps=conn.prepareStatement(sql);/*使用try...catch语句抓取并处理例外*/try{/*设置动态参数值*/ps.setDouble(1,info.salary);ps.setString(2,info.author_code);/*执行动态SQL语句*/ps.executeUpdate();}finally{/*关闭动态SQL语句*/ps.close();}}catch(SQLExceptione){thrownewSQLError(e.getMessage());}}publicvoiddeleteAuthor(Stringauthor_code)throwsSQLError{/*使用try...catch语句抓取并处理例外*/try{/*创建缺省的数据库连接*/Connectionconn=newOracleDriver().defaultConnection();/*构造动态SQL语句*/Stringsql=DELETEFROMauthsWHEREauthor_code=?;/*准备动态SQL语句*/PreparedStatementps=conn.prepareStatement(sql);/*使用try...catch语句抓取并处理例外*/try{/*设置动态参数值*/ps.setString(1,author_code);/*执行动态SQL语句*/ps.executeUpdate();}finally{/*关闭动态SQL语句*/ps.close();}}catch(SQLExceptione){thrownewSQLError(e.getMessage());}}}2)编译并打包CORBA组件在编写了组件代码之后,编译所有Java代码,然后打包这些代码。如下所示:3)装载CORBA组件到Oracle8i数据库4)发行CORBA组件在将CORBA组件装载到Oracle8i数据库后,客户端还不能访问该CORBA组件。只有发行了该组件之后,客户端才能访问该组件。命令如下:实现CORBA应用下面以开发访问CORBA组件的客户应用为例,介绍开发CORBA客户应用的方法。如下图所示:如上图所示,我们将创建四个客户应用,它们将分别实现下述功能:query_author:通过调用queryAuthor方法,检索作者信息。insert_author:通过调用insertAuthor方法,插入作者记录。update_author:通过调用updateAuthor方法,更新作者信息。delete_author:通过调用deleteAuthor方法,删除作者记录。在本小节中,将把这些客户应用开发为JavaApplet应用程序,以便将来可以把它们嵌入到浏览器中执行。如果要在浏览器中执行这些应用,那么读者必须熟悉相应浏览器“安全”方面的内容。在这里将不介绍这部分内容,但读者可以通过appletviewer运行这些应用程序。下面是CORBA客户应用的具体实现方法:1.编写与服务器端完全相同的IDL代码,然后转换这些IDL代码为Java代码。2.实现客户应用query_author1)程序清单(query_author.java)/*导入Java类*/importauthor.*;importoracle.aurora.jndi.sess_iiop.ServiceCtx;importoracle.aurora.jts.client.AuroraTransactionService;importoracle.aurora.jts.util.*;importjavax.naming.Context;importjavax.naming.InitialContext;importjava.u