首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 操作系统-> 经验技巧
利用Java存储过程简化数据库操作-数据库专栏,SQL Server
作者:网友供稿 点击:51
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
 利用java存储过程沟通sql、xml、java、j2ee和web服务。
存储过程(stored procedure)允许将运行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分离开来。这种分离可以降低整个应用程序的复杂性,并提供其重用性、安全性、性能和可伸缩性。

但是,妨碍存储过程广泛采用的一个主要障碍是不同数据库厂商使用各种专有的、且依赖于数据库的实现语言。使用基于java的存储过程可以解决这一问题。oracle已经实现了ansi标准,这些标准规定了从sql中将静态java方法作为过程或函数进行调用的能力。这种实现被简单地称作"java存储过程"。

在本文中,你将了解基于java的存储过程如何帮助简化商务逻辑、提高其性能,并扩展数据库的功能。本文将介绍oracle如何在数据库内启用基于java的存储过程。还会介绍java存储过程如何访问数据,以及如何创建基本java存储过程。

选择pl/sql还是java

在考虑oracle存储过程时,你可能会想到pl/sql。不过,从oracle8i开始,oracle已经在数据库中支持java,从而为存储过程提供了不同于pl/sql的开放式和可移植的方法。我可以听到"$64 000问题":"我如何在pl/sql和java之间做出选择?我是否应当忘记已经学习的所有pl/sql相关知识,而变为一个java天地的新手?"

两种语言都适用于数据库编程,都有自己的优点和弱点。在决定选择哪一种语言时,可以参考下面根据经验得出的通用规则:

对于要求与sql进行无缝集成的数据库中心来说则逻辑使用pl/sql,从而完成对数据库对象、类型和特性的访问。



出于与数据库的无关性考虑时,可以选择java作为开放式的语言来取代pl/sql,同时也为了集成和沟通sql、xml、j2ee和web服务等各个领域。
oralcejvm使得java可以运行在数据库中

从oracle8i版本1(oralce8.1.5)开始,oracle便提供紧密集成的java虚拟机(jvm),jvm支持oralce的数据库会话期结构。任何数据库对话期都可以在第一java代码调用时启动一个虚拟上专用的jvm,后续的用户可以使用这一已经存在的支持java的会话期。事实上,所有会话共享同一jvm代码并保持"仅静态"的私有状态,而垃圾则收集在单个对话期空间内,从而为各个java对话期提供了和sql操作相同的对话期隔离和数据完整性能力。这里,不需要为了数据完整性而进行单独的java支持的过程。这一基于对话期的结构提供了较小的内存占用率,并使oraclejvm具有与oracle数据库一样的线性smp可伸缩性。

创建java存储过程

要将java方法转换为java存储过程需要几个步骤,包括:用loadjava实用程序将java类加载到数据库中,利用调用规范(call spec)发布java方法,将java方法、参数类型和返回类型映射到其sql的对应部分。下面部分说明如何完成这些步骤。

我将使用一个简单的hello类,它有一个方法hello.world(),返回字符串"hello world":


public class hello{ public static string world () { return "hello world"; }}

loadjava 实用程序

loadjava是加载java源文件、java类文件和java资源文件的实用程序,它可以用来验证字节码,并将java类和jar文件布置到数据库中。它既可以通过命令行调用,也可以通过包含于dbms_java类中的loadjava()方法调用。为了加载我们的hello.class示例,输入:


loadjava -user scott/tiger hello.class



从oracle9i版本2开始,loadjava允许通过为包含在被处理的类中的方法创建相应的call specs来自动将java类发布为存储过程。oracle为开发、测试、调试和布置java存储过程提供了oracle9i jdeveloper。

the resolver spec

基于jdk的jvm在列于classpath中的目录中查找类引用,并对其进行解析。因为oracle数据库类存在于数据库模式中,所以oraclejvm利用数据库解析器(resolver)通过列于resolver spec中的模式查找并解析类引用。与classpath不同(classpath可以应用于所有的类),resover spec根据每类的情况进行应用。缺省解析器首先在加载类的模式中搜寻类,然后在公共同义词(public synonyms)中搜索。


loadjava -resolve <myclass>
你可能需要指定不同的解析器,也可以在使用loadjava时强制进行解析,从而在布置时确定可能在以后运行时发生的任何问题。



loadjava -resolve -resolver "((* scott) (foo/bar/* others) (* public))"

call spec和存储过程调用

为了从sql中调用java方法(以及从pl/sql和jdbc中调用),必须首先通过call spec发布公共静态方法,它为sql定义方法采用的参数以及返回的sql类型。

在我们的例子中,我们将利用sql*plus连接到数据库,并为hello.world()定义一个顶级call spec:


sql> connect scott/tigersql> create or replace function helloworld returnvarchar2 as language java name hello.world () returnjava.lang.string; /function created.

可以像下面这样调用java存储过程:


sql> variable mystring varchar2[20];sql> call helloworld() into :mystring;call completed.sql> print mystring;mystring---------------------hello world

java存储过程可以通过其call spec从以下各项中进行调用:sql dml语句(insert, update、delete、select、call、explain plan、lock table和merge)、pl/sql块、子程序、程序包以及数据库触发器。call spec的美妙之处在于存储过程实现可以从pl/sql转换为java,反之亦可,这一点对于请求者是透明的。

call spec从实现语言中(pl/sql或java)中抽象出调用界面,因而使之能够在原有应用程序和新的基于java/j2ee的应用程序之间共享商务逻辑。但是,在从java客户程序调用在数据库驻留的java类时,你可能不希望通过pl/sql包装器(wrapper)。在以后的版本中,oracle计划提供一种机制,它可以使开发人员略过call spec。

高级数据访问控制

java存储过程可用于控制和限制对oracle数据的访问,其方法是只允许用户通过存储过程管理数据,而存储过程在其调用者的权限内执行,而不能对表本身进行访问。例如,你可以在特定时间内禁止更新数据,或者使管理者只具有查询工资数据的权利,而不能进行更新,或者记录所有的访问并通知某一安全机构。

原有应用程序与j2ee应用程序之间的数据逻辑共享

因为原有应用程序与j2ee应用程序都通过call spec调用存储过程,所以j2ee和非j2ee应用程序可以共享相同的数据逻辑。由于有了call spec,所以不用考虑所用的是何种实现语言(无论是pl/sql还是java),该数据逻辑都可以共享。

为bmp实体bean自动生成主关键字

在对ejb实体bean应用bmp时,一个bean实例可以由自动生成的与新插入的数据相关联的主关键字惟一确定,它是ejbcreate()的返回值。可以利用一个插入相应数据的存储过程在一个数据库操作中检索ejbceater()中的该值,并检索或计算主关键字。作为另一种方法,也可以利用jdbc3.0的return_generated_keys特性,以一个sql语句插入该数据并检索相应的关键字(或rowid)。但是,存储过程方法在各个jdbc驱动器版本和数据库之间更具可移植性。

可以用以下三个步骤实现这一模式:

创建一个java存储过程,在公共genpk类中定义一个公共静态java方法insertaccount()。此方法将插入数据、计算惟一的关键字(通过发出一个序列号),并返回计算出的关键字作为主关键字。



定义call spec



create or replace procedure insertaccount(owner invarchar, bal in number, newid out number)as language java name genpk.insertaccount(java.lang.string []);/




在ejbcreate()内调用存储过程



public accountpk ejbcreate(string ownername, int balance) throws createexception{ try { callablestatement call = conn.preparecall{ "{call insertaccount(?, ?, ?)}"}; return new accountpk(accountid); }}

为cmp实体bean定制主关键字查找器

查找器方法(finder methods)用于检索已存在的ejb实体bean实例。主关键字查找器使你能够检索惟一标识的ejb实例。对于cmp实体bean,ejb容器根据声明描述,自动生成主关键字查找器findbyprimarykey()方法。但是,在某些情况下,可能需要更多的控制,例如可能需要专门的查找器,如findbystoredprockey()。在这些情况下,你可以结合使用java存储过程和对象关系框架(如oracle9i应用服务器[oracle9ias] toplink)来实现定制的主关键字查找器方法。在将ejb查找器定义为redirect或named查找器后,toplink将生成一个sql查询用于检索bean实例。

数据驱动的ejb调用

在数据驱动体系结构中,商务逻辑调用可以作为数据库操作(如插入、更新或删除)的结果来触发。实现该数据逻辑的java存储过程可以被声明为数据库触发器,用以调用运行于中间层j2ee应用服务器的ejb。ejb的调用既可以采用j2ee1.3兼容的服务器通过interoperable inter-orb protocol(iiop)标准远程方法调用(remote method invocation,rmi)实现,也可以通过销售商特定的传输协议(如oracle9ias/oc4j的ormi,或者通过bea weblogic的t3)用rmi来实现。每个应用服务器提供商在提供基于iiop的rmi,以提供互操作性的同时,都有其自己优化的协议。oracle9ias同时支持基于iiop的rmi调用和基于ormi协议的rmi调用。

数据驱动的消息传送

oracle9i数据库嵌入了advanced queuing(aq,高级排队),它是一种集成的、稳定、可靠、安全、可扩展和事务处理式的消息排队框架。oracle通过标准的java消息传送系统(java messaging system,jms)api为java开发人员提供aq功能。java存储过程可以通过jms接口调用aq操作,从而能够实现快速、在会话期内、可扩展的、数据驱动的消息传送。

java存储过程可以利用jms调用aq操作。可以用以下4个步骤实现这一模式:

创建并启动jms queue(为此,可以将以下一些操作嵌入sql脚本内):



execute dbms_aqadm.create_queue_table(queue_table =>queue1, queue_payload_type =>sys.aq$_jms_text_message, comment => a test queue, multiple_consumers => false, compatible => 8.1.0);execute dbms_aqadm.create_queue( queue_name => queue1, queue_table => queue1 );execute dbms_aqadm.start_queue(queue_name => queue1);




创建java存储过程(代码摘录如下):



public static void runtest(string msgbody){ try { // get database connection ora_drv = new oracledriver(); db_conn = ora_drv.defaultconnection(); // setup sender (cf online code sample) .. // create message s_msg = s_session.createtextmessage(msgbody); // send message sender.send(s_msg); s_session.commit(); // receive message r_msg = (textmessage) receiver.receive(); r_session.commit(); // output message text string body = r_msg.gettext(); system.out.println("message was "+body+""); ..}}




创建call spec:



create or replace procedure jmsproc (t1 in varchar) as language java name jmssample.main (java.lang.string[]);/




调用存储过程:



call jmsproc(hello);

数据库辅助的web发布(缓冲失效)

各应用程序结构必须面对的一个共同问题是如果可靠地将数据库信息进行缓存,以提高整个系统的性能。jcache是一种即将公布的标准规范(jsr 107),它可以解决这一问题。它说明了一种对java对象临时在内存中进行缓存的方法,包括对象的创建、共享访问、假脱机(spooling)、失效、各jvm的一致性等。它可被用于缓存jsp内最经常读取的数据,如产品目录和价格列表。利用jcache,多数查询的反应时间会因为有缓存的数据而加快(内部测试表明反应时间大约快15倍)。

为了跟踪原始数据的所有变化,并刷新已缓存的数据,java存储过程会作为一个触发器被附加在一个表上。这个表的任何变化都会自动调用该存储过程,后者再调出一个已定义的jsp使jcache对象失效,该对象将其状态映射到该数据库表。在失效时,紧跟其后的查询将强制缓存器根据数据库的数据进行更新。



扩展数据库的功能

在数据库中直接运行java代码的一个妙处就在于要实现新的功能,只需要简单地加载代码或库,并利用call spec制作可用于sql、pl/sql、java、j2ee和非java api的进入点(公共静态方法)。oracle9i数据库用户可以很容易地扩展数据库功能。oracle自己利用这种能力来获得新的应用程序和工具包,如xml developer kits(xdks)。

沟通sql、pl/sql、java、j2ee、.net和xml

oracle xdk是用java编写的,并将其公共方法可用作java存储过程,从而扩展了数据库的xml可编程能力。sql、pl/sql、java、j2ee和非java(.net)商务逻辑都能够访问xml分析器、xslt处理器、xpath引擎和xml sql utility(xsu)。

xml分析器可以通过xmlparser和xmldom包进行访问。xsu是一种java实用程序,它可以由sql查询结果或jdbc resultset生成xml文档,并将xml文档中的数据写入数据库表或视图中。利用xsu,xml输出可以输出为文本、dom树或dts。通过dbms_xmlquery和dbms_xmlsave包,xsu即可用于pl/sql。

结论

oracle数据库与java vm的集成可以创建可移植、功能强大和与数据库无关的数据逻辑和持续性逻辑(persistence logic)。运行于中间层的商务逻辑和运行于数据库层的数据逻辑之间的分离提高了应用程序的可扩展性、灵活性和可维护性。

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·JSP页面中的自定义标签2-JSP教程,Jsp/Servlet
·C#中调用消息对话框,并取得其返回值-.NET教程,C#语言
·StringBuffer帮你减轻Java的负担-JSP教程,Java技巧及代码
·asp之字符串函数示例-ASP教程,ASP应用
·不用iconv库的gb2312与utf-8的互换函数-PHP教程,数据库相关
·windows硬件驱动程序安装目录列表详解
·ASP中正则表达式的应用-ASP教程,ASP基础
·关于VB.net中无法使用VB6控件-.NET教程,VB.Net语言
·清除垃圾 给你的电脑减负让其全速运行
·win98和winxp双系统启动菜单的恢复
最新文章
·别浪费你的大内存 如何给windows提速_经验技巧
·用frontpage手把手教你制作网上电影的发布_frontpages教程
·有效管理系统字体的七种绝技_经验技巧
·c盘空间再小也能安装字体_经验技巧
·不破坏硬盘数据将fat32转为ntfs分区的方法_经验技巧
·服务器变慢的两种非常规解决办法_经验技巧
·seo:刚入门还不如不入门的_seo网站优化
·教你快速释放windows系统资源的小绝招_经验技巧
·巧用流量交换联盟 轻松日入至少60元_网赚技巧
·john chow博客赚钱电子书:必要的 wordpress 装备_网赚技巧
相关主题
  • 利用javascript从数据库取数据来实现csdn首页图片的切换效果 _javascript教程
  • 利用javascript建立web应用_javascript教程
  • 利用javamail收/发gmail邮件(ssl)_邮件服务器
  • 利用Java调用可执行命令-JSP教程,Java技巧及代码
  • 利用Java Reflection(反射)原理,在hibernate里面实现对单表、视图的动态组合查询-JSP教程,Java技巧及代码
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭