WADER

          java,swt,hibernate,struts,xml,spring,ant,cvs,uml,db,server
          隨筆 - 15, 文章 - 0, 評(píng)論 - 0, 引用 - 0
          數(shù)據(jù)加載中……

          Oracle開發(fā)人員 JAVA存儲(chǔ)過(guò)程(轉(zhuǎn)貼)(2005-07-12 17:51 )

          Oracle開發(fā)人員 JAVA存儲(chǔ)過(guò)程
          利用Java存儲(chǔ)過(guò)程簡(jiǎn)化數(shù)據(jù)庫(kù)操作
          作者:Kuassi Mensah
          利用Java存儲(chǔ)過(guò)程溝通SQL、XML、Java、J2EE和Web服務(wù)。
          存儲(chǔ)過(guò)程(stored procedure)允許將運(yùn)行于數(shù)據(jù)庫(kù)層中的持久性邏輯與運(yùn)行于中間層中的商務(wù)邏輯有效地分離開來(lái)。這種分離可以降低整個(gè)應(yīng)用程序的復(fù)雜性,并提供其重用性、安全性、性能和可伸縮性。

          但是,妨礙存儲(chǔ)過(guò)程廣泛采用的一個(gè)主要障礙是不同數(shù)據(jù)庫(kù)廠商使用各種專有的、且依賴于數(shù)據(jù)庫(kù)的實(shí)現(xiàn)語(yǔ)言。使用基于Java的存儲(chǔ)過(guò)程可以解決這一問題。Oracle已經(jīng)實(shí)現(xiàn)了ANSI標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)規(guī)定了從SQL中將靜態(tài)Java方法作為過(guò)程或函數(shù)進(jìn)行調(diào)用的能力。這種實(shí)現(xiàn)被簡(jiǎn)單地稱作"Java存儲(chǔ)過(guò)程"。

          在本文中,你將了解基于Java的存儲(chǔ)過(guò)程如何幫助簡(jiǎn)化商務(wù)邏輯、提高其性能,并擴(kuò)展數(shù)據(jù)庫(kù)的功能。本文將介紹Oracle如何在數(shù)據(jù)庫(kù)內(nèi)啟用基于Java的存儲(chǔ)過(guò)程。還會(huì)介紹Java存儲(chǔ)過(guò)程如何訪問數(shù)據(jù),以及如何創(chuàng)建基本Java存儲(chǔ)過(guò)程。

          選擇PL/SQL還是Java

          在考慮Oracle存儲(chǔ)過(guò)程時(shí),你可能會(huì)想到PL/SQL。不過(guò),從Oracle8i開始,Oracle已經(jīng)在數(shù)據(jù)庫(kù)中支持Java,從而為存儲(chǔ)過(guò)程提供了不同于PL/SQL的開放式和可移植的方法。我可以聽到"$64 000問題":"我如何在PL/SQL和Java之間做出選擇?我是否應(yīng)當(dāng)忘記已經(jīng)學(xué)習(xí)的所有PL/SQL相關(guān)知識(shí),而變?yōu)橐粋€(gè)Java天地的新手?"

          兩種語(yǔ)言都適用于數(shù)據(jù)庫(kù)編程,都有自己的優(yōu)點(diǎn)和弱點(diǎn)。在決定選擇哪一種語(yǔ)言時(shí),可以參考下面根據(jù)經(jīng)驗(yàn)得出的通用規(guī)則:

          對(duì)于要求與SQL進(jìn)行無(wú)縫集成的數(shù)據(jù)庫(kù)中心來(lái)說(shuō)則邏輯使用PL/SQL,從而完成對(duì)數(shù)據(jù)庫(kù)對(duì)象、類型和特性的訪問。
          出于與數(shù)據(jù)庫(kù)的無(wú)關(guān)性考慮時(shí),可以選擇Java作為開放式的語(yǔ)言來(lái)取代PL/SQL,同時(shí)也為了集成和溝通SQL、XML、J2EE和Web服務(wù)等各個(gè)領(lǐng)域。
          OralceJVM使得Java可以運(yùn)行在數(shù)據(jù)庫(kù)中

          從Oracle8i版本1(Oralce8.1.5)開始,Oracle便提供緊密集成的Java虛擬機(jī)(JVM),JVM支持Oralce的數(shù)據(jù)庫(kù)會(huì)話期結(jié)構(gòu)。任何數(shù)據(jù)庫(kù)對(duì)話期都可以在第一Java代碼調(diào)用時(shí)啟動(dòng)一個(gè)虛擬上專用的JVM,后續(xù)的用戶可以使用這一已經(jīng)存在的支持Java的會(huì)話期。事實(shí)上,所有會(huì)話共享同一JVM代碼并保持"僅靜態(tài)"的私有狀態(tài),而垃圾則收集在單個(gè)對(duì)話期空間內(nèi),從而為各個(gè)Java對(duì)話期提供了和SQL操作相同的對(duì)話期隔離和數(shù)據(jù)完整性能力。這里,不需要為了數(shù)據(jù)完整性而進(jìn)行單獨(dú)的Java支持的過(guò)程。這一基于對(duì)話期的結(jié)構(gòu)提供了較小的內(nèi)存占用率,并使OracleJVM具有與Oracle數(shù)據(jù)庫(kù)一樣的線性SMP可伸縮性。

          創(chuàng)建Java存儲(chǔ)過(guò)程

          要將Java方法轉(zhuǎn)換為Java存儲(chǔ)過(guò)程需要幾個(gè)步驟,包括:用loadjava實(shí)用程序?qū)ava類加載到數(shù)據(jù)庫(kù)中,利用調(diào)用規(guī)范(Call Spec)發(fā)布Java方法,將Java方法、參數(shù)類型和返回類型映射到其SQL的對(duì)應(yīng)部分。下面部分說(shuō)明如何完成這些步驟。

          我將使用一個(gè)簡(jiǎn)單的Hello類,它有一個(gè)方法Hello.world(),返回字符串"Hello world":
          public class Hello { public static String world () { return "Hello world"; } }
          Loadjava 實(shí)用程序

          Loadjava是加載Java源文件、Java類文件和Java資源文件的實(shí)用程序,它可以用來(lái)驗(yàn)證字節(jié)碼,并將Java類和JAR文件布置到數(shù)據(jù)庫(kù)中。它既可以通過(guò)命令行調(diào)用,也可以通過(guò)包含于DBMS_JAVA類中的loadjava()方法調(diào)用。為了加載我們的Hello.class示例,輸入:
          loadjava -user scott/tiger Hello.class

          從Oracle9i版本2開始,loadjava允許通過(guò)為包含在被處理的類中的方法創(chuàng)建相應(yīng)的Call Specs來(lái)自動(dòng)將Java類發(fā)布為存儲(chǔ)過(guò)程。Oracle為開發(fā)、測(cè)試、調(diào)試和布置Java存儲(chǔ)過(guò)程提供了Oracle9i JDeveloper。

          The Resolver Spec

          基于JDK的JVM在列于CLASSPATH中的目錄中查找類引用,并對(duì)其進(jìn)行解析。因?yàn)镺racle數(shù)據(jù)庫(kù)類存在于數(shù)據(jù)庫(kù)模式中,所以O(shè)racleJVM利用數(shù)據(jù)庫(kù)解析器(resolver)通過(guò)列于Resolver Spec中的模式查找并解析類引用。與CLASSPATH不同(CLASSPATH可以應(yīng)用于所有的類),Resover Spec根據(jù)每類的情況進(jìn)行應(yīng)用。缺省解析器首先在加載類的模式中搜尋類,然后在公共同義詞(public synonyms)中搜索。 
           loadjava -resolve <myclass>
          你可能需要指定不同的解析器,也可以在使用loadjava時(shí)強(qiáng)制進(jìn)行解析,從而在布置時(shí)確定可能在以后運(yùn)行時(shí)發(fā)生的任何問題。
          loadjava -resolve -resolver "((* SCOTT) (foo/bar/* OTHERS) (* PUBLIC))"
          Call Spec和存儲(chǔ)過(guò)程調(diào)用

          為了從SQL中調(diào)用Java方法(以及從PL/SQl和JDBC中調(diào)用),必須首先通過(guò)Call Spec發(fā)布公共靜態(tài)方法,它為SQL定義方法采用的參數(shù)以及返回的SQL類型。

          在我們的例子中,我們將利用SQL*Plus連接到數(shù)據(jù)庫(kù),并為Hello.world()定義一個(gè)頂級(jí)Call Spec:
          SQL> connect scott/tiger SQL> create or replace function helloworld return VARCHAR2 as language java name 'Hello.world () return java.lang.String'; / Function created.
          可以像下面這樣調(diào)用Java存儲(chǔ)過(guò)程:
          SQL> variable myString varchar2[20]; SQL> call helloworld() into :myString; Call completed. SQL> print myString; MYSTRING --------------------- Hello world
          Java存儲(chǔ)過(guò)程可以通過(guò)其Call Spec從以下各項(xiàng)中進(jìn)行調(diào)用:SQL DML語(yǔ)句(INSERT, UPDATE、DELETE、SELECT、CALL、EXPLAIN PLAN、LOCK TABLE和MERGE)、PL/SQL塊、子程序、程序包以及數(shù)據(jù)庫(kù)觸發(fā)器。Call Spec的美妙之處在于存儲(chǔ)過(guò)程實(shí)現(xiàn)可以從PL/SQL轉(zhuǎn)換為Java,反之亦可,這一點(diǎn)對(duì)于請(qǐng)求者是透明的。

          Call Spec從實(shí)現(xiàn)語(yǔ)言中(PL/SQL或Java)中抽象出調(diào)用界面,因而使之能夠在原有應(yīng)用程序和新的基于Java/J2EE的應(yīng)用程序之間共享商務(wù)邏輯。但是,在從Java客戶程序調(diào)用在數(shù)據(jù)庫(kù)駐留的Java類時(shí),你可能不希望通過(guò)PL/SQL包裝器(wrapper)。在以后的版本中,Oracle計(jì)劃提供一種機(jī)制,它可以使開發(fā)人員略過(guò)Call Spec。

          高級(jí)數(shù)據(jù)訪問控制

          Java存儲(chǔ)過(guò)程可用于控制和限制對(duì)Oracle數(shù)據(jù)的訪問,其方法是只允許用戶通過(guò)存儲(chǔ)過(guò)程管理數(shù)據(jù),而存儲(chǔ)過(guò)程在其調(diào)用者的權(quán)限內(nèi)執(zhí)行,而不能對(duì)表本身進(jìn)行訪問。例如,你可以在特定時(shí)間內(nèi)禁止更新數(shù)據(jù),或者使管理者只具有查詢工資數(shù)據(jù)的權(quán)利,而不能進(jìn)行更新,或者記錄所有的訪問并通知某一安全機(jī)構(gòu)。

          原有應(yīng)用程序與J2EE應(yīng)用程序之間的數(shù)據(jù)邏輯共享因?yàn)樵袘?yīng)用程序與J2EE應(yīng)用程序都通過(guò)Call Spec調(diào)用存儲(chǔ)過(guò)程,所以J2EE和非J2EE應(yīng)用程序可以共享相同的數(shù)據(jù)邏輯。由于有了Call Spec,所以不用考慮所用的是何種實(shí)現(xiàn)語(yǔ)言(無(wú)論是PL/SQL還是Java),該數(shù)據(jù)邏輯都可以共享。

          為BMP實(shí)體Bean自動(dòng)生成主關(guān)鍵字

          在對(duì)EJB實(shí)體bean應(yīng)用BMP時(shí),一個(gè)bean實(shí)例可以由自動(dòng)生成的與新插入的數(shù)據(jù)相關(guān)聯(lián)的主關(guān)鍵字惟一確定,它是ejbCreate()的返回值。可以利用一個(gè)插入相應(yīng)數(shù)據(jù)的存儲(chǔ)過(guò)程在一個(gè)數(shù)據(jù)庫(kù)操作中檢索ejbCeater()中的該值,并檢索或計(jì)算主關(guān)鍵字。作為另一種方法,也可以利用JDBC3.0的RETURN_GENERATED_KEYS特性,以一個(gè)SQL語(yǔ)句插入該數(shù)據(jù)并檢索相應(yīng)的關(guān)鍵字(或ROWID)。但是,存儲(chǔ)過(guò)程方法在各個(gè)JDBC驅(qū)動(dòng)器版本和數(shù)據(jù)庫(kù)之間更具可移植性。

          posted on 2005-11-23 15:54 wader 閱讀(443) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 上饶市| 探索| 辛集市| 榆树市| 南澳县| 格尔木市| 龙州县| 合水县| 桃园县| 梓潼县| 大关县| 滨州市| 中牟县| 大港区| 佛冈县| 巩义市| 东乌| 酒泉市| 六安市| 马龙县| 淄博市| 开远市| 东乌| 汪清县| 三门峡市| 富蕴县| 铁力市| 宜城市| 那坡县| 宜良县| 台中县| 马公市| 高尔夫| 天祝| 肃宁县| 台北县| 五台县| 安龙县| 台前县| 上虞市| 河曲县|