|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
曾经的功能列表可能会迅速变得过时了。而且,有些功能对有的应用程序非常重要,但是对别的应用程序则不一定。oracle|存储历程
Oracle开辟职员JAVA存储历程
使用Java存储历程简化数据库操纵
KuassiMensah
使用Java存储历程相同SQL、XML、Java、J2EE和Web服务。
存储历程(storedprocedure)同意将运转于数据库层中的耐久性逻辑与运转于两头层中的商务逻辑无效地分别开来。这类分别能够下降全部使用程序的庞大性,并供应其重用性、平安性、功能和可伸缩性。
可是,妨害存储历程普遍接纳的一个次要停滞是分歧数据库厂商利用各类专有的、且依附于数据库的完成言语。利用基于Java的存储历程能够办理这一成绩。Oracle已完成了ANSI尺度,这些尺度划定了从SQL中将静态Java办法作为历程或函数举行挪用的才能。这类完成被复杂地称作"Java存储历程"。
在本文中,你将懂得基于Java的存储历程怎样匡助简化商务逻辑、进步其功能,并扩大数据库的功效。本文将先容Oracle怎样在数据库内启用基于Java的存储历程。还会先容Java存储历程怎样会见数据,和怎样创立基础Java存储历程。
选择PL/SQL仍是Java
在思索Oracle存储历程时,你大概会想到PL/SQL。不外,从Oracle8i入手下手,Oracle已在数据库中撑持Java,从而为存储历程供应了分歧于PL/SQL的开放式和可移植的办法。我能够听到"$64000成绩":"我怎样在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类加载到数据库中,使用挪用标准(CallSpec)公布Java办法,将Java办法、参数范例和前往范例映照到其SQL的对应部分。上面部分辩明怎样完成这些步骤。
我将利用一个复杂的Hello类,它有一个办法Hello.world(),前往字符串"Helloworld":
publicclassHello{publicstaticStringworld(){return"Helloworld";}}
Loadjava有用程序
Loadjava是加载Java源文件、Java类文件和Java资本文件的有用程序,它能够用来考证字节码,并将Java类和JAR文件安排到数据库中。它既能够经由过程命令行挪用,也能够经由过程包括于DBMS_JAVA类中的loadjava()办法挪用。为了加载我们的Hello.class示例,输出:
loadjava-userscott/tigerHello.class
从Oracle9i版本2入手下手,loadjava同意经由过程为包括在被处置的类中的办法创立响应的CallSpecs来主动将Java类公布为存储历程。Oracle为开辟、测试、调试和安排Java存储历程供应了Oracle9iJDeveloper。
TheResolverSpec
基于JDK的JVM在列于CLASSPATH中的目次中查找类援用,并对其举行剖析。由于Oracle数据库类存在于数据库形式中,以是OracleJVM使用数据库剖析器(resolver)经由过程列于ResolverSpec中的形式查找并剖析类援用。与CLASSPATH分歧(CLASSPATH能够使用于一切的类),ResoverSpec依据每类的情形举行使用。缺省剖析器起首在加载类的形式中征采类,然后在大众同义词(publicsynonyms)中搜刮。
loadjava-resolve<myclass>
你大概必要指定分歧的剖析器,也能够在利用loadjava时强迫举行剖析,从而在安排时断定大概在今后运转时产生的任何成绩。
loadjava-resolve-resolver"((*SCOTT)(foo/bar/*OTHERS)(*PUBLIC))"
CallSpec和存储历程挪用
为了从SQL中挪用Java办法(和从PL/SQl和JDBC中挪用),必需起首经由过程CallSpec公布大众静态办法,它为SQL界说办法接纳的参数和前往的SQL范例。
在我们的例子中,我们将使用SQL*Plus毗连到数据库,并为Hello.world()界说一个顶级CallSpec:
SQL>connectscott/tigerSQL>createorreplacefunctionhelloworldreturnVARCHAR2aslanguagejavanameHello.world()returnjava.lang.String;/Functioncreated.
能够像上面如许挪用Java存储历程:
SQL>variablemyStringvarchar2[20];SQL>callhelloworld()into:myString;Callcompleted.SQL>printmyString;MYSTRING---------------------Helloworld
Java存储历程能够经由过程其CallSpec从以下各项中举行挪用:SQLDML语句(INSERT,UPDATE、DELETE、SELECT、CALL、EXPLAINPLAN、LOCKTABLE和MERGE)、PL/SQL块、子程序、程序包和数据库触发器。CallSpec的美好的地方在于存储历程完成能够从PL/SQL转换为Java,反之亦可,这一点关于哀求者是通明的。
CallSpec从完成言语中(PL/SQL或Java)中笼统出挪用界面,因此使之可以在原有使用程序和新的基于Java/J2EE的使用程序之间共享商务逻辑。可是,在从Java客户程序挪用在数据库驻留的Java类时,你大概不但愿经由过程PL/SQL包装器(wrapper)。在今后的版本中,Oracle企图供应一种机制,它可使开辟职员略过CallSpec。
初级数据会见把持
Java存储历程可用于把持和限定对Oracle数据的会见,其办法是只同意用户经由过程存储历程办理数据,而存储历程在其挪用者的权限内实行,而不克不及对表自己举行会见。比方,你能够在特准时间内克制更新数据,大概使办理者只具有查询人为数据的权力,而不克不及举行更新,大概纪录一切的会见并关照某一平安机构。
原有使用程序与J2EE使用程序之间的数据逻辑共享
由于原有使用程序与J2EE使用程序都经由过程CallSpec挪用存储历程,以是J2EE和非J2EE使用程序能够共享不异的数据逻辑。因为有了CallSpec,以是不必思索所用的是何种完成言语(不管是PL/SQL仍是Java),该数据逻辑都能够共享。
为BMP实体Bean主动天生主关头字
在对EJB实体bean使用BMP时,一个bean实例能够由主动天生的与新拔出的数据相干联的主关头字唯一断定,它是ejbCreate()的前往值。能够使用一个拔出响应数据的存储历程在一个数据库操纵中检索ejbCeater()中的该值,并检索或盘算主关头字。作为另外一种办法,也能够使用JDBC3.0的RETURN_GENERATED_KEYS特征,以一个SQL语句拔出该数据并检索响应的关头字(或ROWID)。可是,存储历程办法在各个JDBC驱动器版本和数据库之间更具可移植性。
能够用以下三个步骤完成这一形式:
创立一个Java存储历程,在大众GenPk类中界说一个大众静态Java办法insertAccount()。此办法将拔出数据、盘算唯一的关头字(经由过程收回一个序列号),并前往盘算出的关头字作为主关头字。
界说CallSpec
CREATEORREPLACEPROCEDUREinsertAccount(ownerINvarchar,balINnumber,newidOUTnumber)ASLANGUAGEJAVANAMEGenPK.insertAccount(java.lang.String[]);/
在ejbCreate()内挪用存储历程
PublicAccountPKejbCreate(StringownerName,intbalance)throwsCreateException{try{CallableStatementcall=conn.prepareCall{"{callinsertAccount(?,?,?)}"};returnnewAccountPK(accountID);}}
为CMP实体Bean定制主关头字查找器
查找器办法(Findermethods)用于检索已存在的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兼容的服务器经由过程InteroperableInter-ORBProtocol(IIOP)尺度远程办法挪用(remotemethodinvocation,RMI)完成,也能够经由过程发卖商特定的传输协定(如Oracle9iAS/Oc4J的ORMI,大概经由过程BEAWebLogic的T3)用RMI来完成。每一个使用服务器供应商在供应基于IIOP的RMI,以供应互操纵性的同时,都有其本人优化的协定。Oracle9iAS同时撑持基于IIOP的RMI挪用和基于ORMI协定的RMI挪用。
数据驱动的动静传送
Oracle9i数据库嵌进了AdvancedQueuing(AQ,初级列队),它是一种集成的、不乱、牢靠、平安、可扩大和事件处置式的动静列队框架。Oracle经由过程尺度的Java动静传送体系(JavaMessagingSystem,JMS)API为Java开辟职员供应AQ功效。Java存储历程能够经由过程JMS接口挪用AQ操纵,从而可以完成疾速、在会话期内、可扩大的、数据驱动的动静传送。
Java存储历程能够使用JMS挪用AQ操纵。能够用以下4个步骤完成这一形式:
创立并启动JMSQueue(为此,能够将以下一些操纵嵌进SQL剧本内):
executedbms_aqadm.create_queue_table(queue_table=>queue1,queue_payload_type=>SYS.AQ$_JMS_TEXT_MESSAGE,comment=>atestqueue,multiple_consumers=>false,compatible=>8.1.0);executedbms_aqadm.create_queue(queue_name=>queue1,queue_table=>queue1);executedbms_aqadm.start_queue(queue_name=>queue1);
创立Java存储历程(代码摘录以下):
publicstaticvoidrunTest(StringmsgBody){try{//getdatabaseconnectionora_drv=newOracleDriver();db_conn=ora_drv.defaultConnection();//setupsender(cfonlinecodesample)..//createmessages_msg=s_session.createTextMessage(msgBody);//sendmessagesender.send(s_msg);s_session.commit();//receivemessager_msg=(TextMessage)receiver.receive();r_session.commit();//outputmessagetextStringbody=r_msg.getText();System.out.println("messagewas"+body+"");..}}
创立CallSpec:
createorreplaceprocedurejmsproc(t1INVARCHAR)aslanguagejavanamejmsSample.main(java.lang.String[]);/
挪用存储历程:
calljmsproc(hello);
数据库帮助的Web公布(缓冲生效)
各使用程序布局必需面临的一个配合成绩是假如牢靠地将数据库信息举行缓存,以进步全部体系的功能。JCACHE是一种行将发布的尺度标准(JSR107),它能够办理这一成绩。它申明了一种对Java工具一时在内存中举行缓存的办法,包含工具的创立、共享会见、假脱机(spooling)、生效、各JVM的分歧性等。它可被用于缓存JSP内最常常读取的数据,如产物目次和代价列表。使用JCACHE,多半查询的反响工夫会由于有缓存的数据而加速(外部测试标明反响工夫约莫快15倍)。
为了跟踪原始数据的一切变更,并革新已缓存的数据,Java存储历程会作为一个触发器被附加在一个表上。这个表的任何变更城市主动挪用该存储历程,后者再修改一个已界说的JSP使JCACHE工具生效,该工具将其形态映照到该数据库表。在生效时,紧跟厥后的查询将强迫缓存器依据数据库的数据举行更新。上面的步骤
浏览关于Java存储历程的更多信息
本文摘自白皮书"开释Java存储历程的能量(UnleashthePowerofJavaStoredProcedures)",能够在以下地位找到该白皮书:
otn.oracle.com/tech/java/java_db/pdf/
OW_30820_JAVA_STORED_PROC_paper.PDF
Oracle9i数据库第2版中的新PL/SQL特征
otn.oracle.com/tech/pl_sql/pdf/
Paper_30720_Doc.pdf
ResolverSpec
otn.oracle.com/docs/products/oracle9i/
doc_library/release2/java.920/a96659.pdf
OracleJVMandJava2Security
otn.oracle.com/docs/products/oracle9i/
doc_library/release2/java.920/a96656.pdf
下载代码
实习本文中的代码示例:
otn.oracle.com/sample_code/tech/
java/jsp/Oracle9iJSPSamples.html
懂得作为Web服务的存储历程
otn.oracle.com/tech/webservices
扩大数据库的功效
在数据库中间接运转Java代码的一个妙处就在于要完成新的功效,只必要复杂地加载代码或库,并使用CallSpec制造可用于SQL、PL/SQL、Java、J2EE和非JavaAPI的进进点(大众静态办法)。Oracle9i数据库用户能够很简单地扩大数据库功效。Oracle本人使用这类才能来取得新的使用程序和工具包,如XMLDeveloperKits(XDKs)。
相同SQL、PL/SQL、Java、J2EE、.NET和XML
OracleXDK是用Java编写的,并将其大众办法可用作Java存储历程,从而扩大了数据库的XML可编程才能。SQL、PL/SQL、Java、J2EE和非Java(.NET)商务逻辑都可以会见XML剖析器、XSLT处置器、XPath引擎和XMLSQLUtility(XSU)。
XML剖析器能够经由过程xmlparser和xmldom包举行会见。XSU是一种Java有用程序,它能够由SQL查询了局或JDBCResultSet天生XML文档,并将XML文档中的数据写进数据库表或视图中。使用XSU,XML输入能够输入为文本、Dom树或DTS。经由过程dbms_xmlquery和dbms_xmlsave包,XSU便可用于PL/SQL。
结论
Oracle数据库与JavaVM的集成能够创立可移植、功效壮大和与数据库有关的数据逻辑和延续性逻辑(persistencelogic)。运转于两头层的商务逻辑和运转于数据库层的数据逻辑之间的分别进步了使用程序的可扩大性、天真性和可保护性。
如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。 |
|