<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 78,  comments - 48,  trackbacks - 0
    Oracle開發(fā)人員 JAVA存儲(chǔ)過程
    利用Java存儲(chǔ)過程簡(jiǎn)化數(shù)據(jù)庫操作

    作者:Kuassi Mensah

    利用Java存儲(chǔ)過程溝通SQL、XML、Java、J2EE和Web服務(wù)。

    存儲(chǔ)過程(stored procedure)允許將運(yùn)行于數(shù)據(jù)庫層中的持久性邏輯與運(yùn)行于中間層中的商務(wù)邏輯有效地分離開來。這種分離可以降低整個(gè)應(yīng)用程序的復(fù)雜性,并提供其重用性、安全性、性能和可伸縮性。

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

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

    選擇PL/SQL還是Java

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

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


    對(duì)于要求與SQL進(jìn)行無縫集成的數(shù)據(jù)庫中心來說則邏輯使用PL/SQL,從而完成對(duì)數(shù)據(jù)庫對(duì)象、類型和特性的訪問。


    出于與數(shù)據(jù)庫的無關(guān)性考慮時(shí),可以選擇Java作為開放式的語言來取代PL/SQL,同時(shí)也為了集成和溝通SQL、XML、J2EE和Web服務(wù)等各個(gè)領(lǐng)域。
    OralceJVM使得Java可以運(yùn)行在數(shù)據(jù)庫中

    從Oracle8i版本1(Oralce8.1.5)開始,Oracle便提供緊密集成的Java虛擬機(jī)(JVM),JVM支持Oralce的數(shù)據(jù)庫會(huì)話期結(jié)構(gòu)。任何數(shù)據(jù)庫對(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支持的過程。這一基于對(duì)話期的結(jié)構(gòu)提供了較小的內(nèi)存占用率,并使OracleJVM具有與Oracle數(shù)據(jù)庫一樣的線性SMP可伸縮性。

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

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

    我將使用一個(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í)用程序,它可以用來驗(yàn)證字節(jié)碼,并將Java類和JAR文件布置到數(shù)據(jù)庫中。它既可以通過命令行調(diào)用,也可以通過包含于DBMS_JAVA類中的loadjava()方法調(diào)用。為了加載我們的Hello.class示例,輸入:


    loadjava -user scott/tiger Hello.class

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

    The Resolver Spec

    基于JDK的JVM在列于CLASSPATH中的目錄中查找類引用,并對(duì)其進(jìn)行解析。因?yàn)镺racle數(shù)據(jù)庫類存在于數(shù)據(jù)庫模式中,所以O(shè)racleJVM利用數(shù)據(jù)庫解析器(resolver)通過列于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ǔ)過程調(diào)用

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

    在我們的例子中,我們將利用SQL*Plus連接到數(shù)據(jù)庫,并為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ǔ)過程:


    SQL> variable myString varchar2[20]; SQL> call helloworld() into :myString; Call completed. SQL> print myString; MYSTRING --------------------- Hello world
    Java存儲(chǔ)過程可以通過其Call Spec從以下各項(xiàng)中進(jìn)行調(diào)用:SQL DML語句(INSERT, UPDATE、DELETE、SELECT、CALL、EXPLAIN PLAN、LOCK TABLE和MERGE)、PL/SQL塊、子程序、程序包以及數(shù)據(jù)庫觸發(fā)器。Call Spec的美妙之處在于存儲(chǔ)過程實(shí)現(xiàn)可以從PL/SQL轉(zhuǎn)換為Java,反之亦可,這一點(diǎn)對(duì)于請(qǐng)求者是透明的。

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

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

    Java存儲(chǔ)過程可用于控制和限制對(duì)Oracle數(shù)據(jù)的訪問,其方法是只允許用戶通過存儲(chǔ)過程管理數(shù)據(jù),而存儲(chǔ)過程在其調(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)用程序都通過Call Spec調(diào)用存儲(chǔ)過程,所以J2EE和非J2EE應(yīng)用程序可以共享相同的數(shù)據(jù)邏輯。由于有了Call Spec,所以不用考慮所用的是何種實(shí)現(xiàn)語言(無論是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ǔ)過程在一個(gè)數(shù)據(jù)庫操作中檢索ejbCeater()中的該值,并檢索或計(jì)算主關(guān)鍵字。作為另一種方法,也可以利用JDBC3.0的RETURN_GENERATED_KEYS特性,以一個(gè)SQL語句插入該數(shù)據(jù)并檢索相應(yīng)的關(guān)鍵字(或ROWID)。但是,存儲(chǔ)過程方法在各個(gè)JDBC驅(qū)動(dòng)器版本和數(shù)據(jù)庫之間更具可移植性。

    可以用以下三個(gè)步驟實(shí)現(xiàn)這一模式:
    >
    創(chuàng)建一個(gè)Java存儲(chǔ)過程,在公共GenPk類中定義一個(gè)公共靜態(tài)Java方法insertAccount()。此方法將插入數(shù)據(jù)、計(jì)算惟一的關(guān)鍵字(通過發(fā)出一個(gè)序列號(hào)),并返回計(jì)算出的關(guān)鍵字作為主關(guān)鍵字。


    定義Call Spec


    CREATE OR REPLACE PROCEDURE insertAccount(owner IN varchar, bal IN number, newid OUT number) AS LANGUAGE JAVA NAME 'GenPK.insertAccount( java.lang.String [])'; /


    在ejbCreate()內(nèi)調(diào)用存儲(chǔ)過程


    Public AccountPK ejbCreate(String ownerName, int balance) throws CreateException { try { CallableStatement call = conn.prepareCall{ "{call insertAccount(?, ?, ?)}"}; return new AccountPK(accountID); } }
    為CMP實(shí)體Bean定制主關(guān)鍵字查找器

    查找器方法(Finder methods)用于檢索已存在的EJB實(shí)體bean實(shí)例。主關(guān)鍵字查找器使你能夠檢索惟一標(biāo)識(shí)的EJB實(shí)例。對(duì)于CMP實(shí)體bean,EJB容器根據(jù)聲明描述,自動(dòng)生成主關(guān)鍵字查找器findByPrimaryKey()方法。但是,在某些情況下,可能需要更多的控制,例如可能需要專門的查找器,如findByStoredProcKey()。在這些情況下,你可以結(jié)合使用Java存儲(chǔ)過程和對(duì)象關(guān)系框架(如Oracle9i應(yīng)用服務(wù)器[Oracle9iAS] TopLink)來實(shí)現(xiàn)定制的主關(guān)鍵字查找器方法。在將EJB查找器定義為REDIRECT或NAMED查找器后,TopLink將生成一個(gè)SQL查詢用于檢索bean實(shí)例。

    數(shù)據(jù)驅(qū)動(dòng)的EJB調(diào)用

    在數(shù)據(jù)驅(qū)動(dòng)體系結(jié)構(gòu)中,商務(wù)邏輯調(diào)用可以作為數(shù)據(jù)庫操作(如插入、更新或刪除)的結(jié)果來觸發(fā)。實(shí)現(xiàn)該數(shù)據(jù)邏輯的Java存儲(chǔ)過程可以被聲明為數(shù)據(jù)庫觸發(fā)器,用以調(diào)用運(yùn)行于中間層J2EE應(yīng)用服務(wù)器的EJB。EJB的調(diào)用既可以采用J2EE1.3兼容的服務(wù)器通過Interoperable Inter-ORB Protocol(IIOP)標(biāo)準(zhǔn)遠(yuǎn)程方法調(diào)用(remote method invocation,RMI)實(shí)現(xiàn),也可以通過銷售商特定的傳輸協(xié)議(如Oracle9iAS/Oc4J的ORMI,或者通過BEA WebLogic的T3)用RMI來實(shí)現(xiàn)。每個(gè)應(yīng)用服務(wù)器提供商在提供基于IIOP的RMI,以提供互操作性的同時(shí),都有其自己優(yōu)化的協(xié)議。Oracle9iAS同時(shí)支持基于IIOP的RMI調(diào)用和基于ORMI協(xié)議的RMI調(diào)用。

    數(shù)據(jù)驅(qū)動(dòng)的消息傳送

    Oracle9i數(shù)據(jù)庫嵌入了Advanced Queuing(AQ,高級(jí)排隊(duì)),它是一種集成的、穩(wěn)定、可靠、安全、可擴(kuò)展和事務(wù)處理式的消息排隊(duì)框架。Oracle通過標(biāo)準(zhǔn)的Java消息傳送系統(tǒng)(Java Messaging System,JMS)API為Java開發(fā)人員提供AQ功能。Java存儲(chǔ)過程可以通過JMS接口調(diào)用AQ操作,從而能夠?qū)崿F(xiàn)快速、在會(huì)話期內(nèi)、可擴(kuò)展的、數(shù)據(jù)驅(qū)動(dòng)的消息傳送。

    Java存儲(chǔ)過程可以利用JMS調(diào)用AQ操作。可以用以下4個(gè)步驟實(shí)現(xiàn)這一模式:


    創(chuàng)建并啟動(dòng)JMS Queue(為此,可以將以下一些操作嵌入SQL腳本內(nèi)):


    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');


    創(chuàng)建Java存儲(chǔ)過程(代碼摘錄如下):


    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+"'"); ..} }


    創(chuàng)建Call Spec:


    create or replace procedure jmsproc (t1 IN VARCHAR) as language java name 'jmsSample.main (java.lang.String[])'; /


    調(diào)用存儲(chǔ)過程:


    call jmsproc('hello');
    數(shù)據(jù)庫輔助的Web發(fā)布(緩沖失效)

    各應(yīng)用程序結(jié)構(gòu)必須面對(duì)的一個(gè)共同問題是如果可靠地將數(shù)據(jù)庫信息進(jìn)行緩存,以提高整個(gè)系統(tǒng)的性能。JCACHE是一種即將公布的標(biāo)準(zhǔn)規(guī)范(JSR 107),它可以解決這一問題。它說明了一種對(duì)Java對(duì)象臨時(shí)在內(nèi)存中進(jìn)行緩存的方法,包括對(duì)象的創(chuàng)建、共享訪問、假脫機(jī)(spooling)、失效、各JVM的一致性等。它可被用于緩存JSP內(nèi)最經(jīng)常讀取的數(shù)據(jù),如產(chǎn)品目錄和價(jià)格列表。利用JCACHE,多數(shù)查詢的反應(yīng)時(shí)間會(huì)因?yàn)橛芯彺娴臄?shù)據(jù)而加快(內(nèi)部測(cè)試表明反應(yīng)時(shí)間大約快15倍)。

    為了跟蹤原始數(shù)據(jù)的所有變化,并刷新已緩存的數(shù)據(jù),Java存儲(chǔ)過程會(huì)作為一個(gè)觸發(fā)器被附加在一個(gè)表上。這個(gè)表的任何變化都會(huì)自動(dòng)調(diào)用該存儲(chǔ)過程,后者再調(diào)出一個(gè)已定義的JSP使JCACHE對(duì)象失效,該對(duì)象將其狀態(tài)映射到該數(shù)據(jù)庫表。在失效時(shí),緊跟其后的查詢將強(qiáng)制緩存器根據(jù)數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行更新。 下面的步驟
    閱讀關(guān)于Java存儲(chǔ)過程的更多信息
    本文摘自白皮書"釋放Java存儲(chǔ)過程的能量(Unleash the Power of Java Stored Procedures)",可以在以下位置找到該白皮書:
    otn.oracle.com/tech/java/java_db/pdf/
    OW_30820_JAVA_STORED_PROC_paper.PDF

    Oracle9i數(shù)據(jù)庫第2版中的新PL/SQL特性
    otn.oracle.com/tech/pl_sql/pdf/
    Paper_30720_Doc.pdf

    Resolver Spec
    otn.oracle.com/docs/products/oracle9i/
    doc_library/release2/java.920/a96659.pdf

    OracleJVM and Java 2 Security
    otn.oracle.com/docs/products/oracle9i/
    doc_library/release2/java.920/a96656.pdf

    下載代碼
    練習(xí)本文中的代碼示例:
    otn.oracle.com/sample_code/tech/
    java/jsp/Oracle9iJSPSamples.html

    了解作為Web服務(wù)的存儲(chǔ)過程
    otn.oracle.com/tech/webservices
    ?


    擴(kuò)展數(shù)據(jù)庫的功能

    在數(shù)據(jù)庫中直接運(yùn)行Java代碼的一個(gè)妙處就在于要實(shí)現(xiàn)新的功能,只需要簡(jiǎn)單地加載代碼或庫,并利用Call Spec制作可用于SQL、PL/SQL、Java、J2EE和非Java API的進(jìn)入點(diǎn)(公共靜態(tài)方法)。Oracle9i數(shù)據(jù)庫用戶可以很容易地?cái)U(kuò)展數(shù)據(jù)庫

    功能。Oracle自己利用這種能力來獲得新的應(yīng)用程序和工具包,如XML Developer Kits(XDKs)。

    溝通SQL、PL/SQL、Java、J2EE、.NET和XML

    Oracle XDK是用Java編寫的,并將其公共方法可用作Java存儲(chǔ)過程,從而擴(kuò)展了數(shù)據(jù)庫的XML可編程能力。SQL、PL/SQL、Java、J2EE和非Java(.NET)商務(wù)邏輯都能夠訪問XML分析器、XSLT處理器、XPath引擎和XML SQL Utility(XSU)。

    XML分析器可以通過xmlparser和xmldom包進(jìn)行訪問。XSU是一種Java實(shí)用程序,它可以由SQL查詢結(jié)果或JDBC ResultSet生成XML文檔,并將XML文檔中的數(shù)據(jù)寫入數(shù)據(jù)庫表或視圖中。利用XSU,XML輸出可以輸出為文本、Dom樹或DTS。通過dbms_xmlquery和dbms_xmlsave包,XSU即可用于PL/SQL。

    結(jié)論

    Oracle數(shù)據(jù)庫與Java VM的集成可以創(chuàng)建可移植、功能強(qiáng)大和與數(shù)據(jù)庫無關(guān)的數(shù)據(jù)邏輯和持續(xù)性邏輯(persistence logic)。運(yùn)行于中間層的商務(wù)邏輯和運(yùn)行于數(shù)據(jù)庫層的數(shù)據(jù)邏輯之間的分離提高了應(yīng)用程序的可擴(kuò)展性、靈活性和可維護(hù)性。

    posted on 2006-08-16 11:55 黑咖啡 閱讀(265) 評(píng)論(0)  編輯  收藏 所屬分類: Tec Article

    <2006年8月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    留言簿(2)

    隨筆分類(67)

    文章分類(43)

    Good Article

    Good Blogs

    Open Source

    最新隨筆

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲色最新高清av网站| 亚洲香蕉免费有线视频| 蜜臀亚洲AV无码精品国产午夜.| 亚洲国产美国国产综合一区二区| 亚洲午夜福利精品无码| 免费看a级黄色片| 久久久久久久91精品免费观看| a级成人毛片免费视频高清| 免费国产黄网站在线观看动图| 久久亚洲国产最新网站| 亚洲欧洲精品在线| 亚洲爆乳无码一区二区三区| 亚洲精品国产va在线观看蜜芽| 国产在线a不卡免费视频| 人禽杂交18禁网站免费| 亚洲毛片免费视频| 91在线手机精品免费观看| 巨胸狂喷奶水视频www网站免费| 黄色a三级免费看| 色偷偷亚洲男人天堂| 亚洲AV无码专区在线电影成人 | 一本一道dvd在线观看免费视频| 亚洲αⅴ无码乱码在线观看性色| 亚洲一区无码中文字幕乱码| 亚洲酒色1314狠狠做| 亚洲视频国产精品| 亚洲视频在线观看地址| 亚洲高清无在码在线无弹窗| 亚洲无限乱码一二三四区| 久久精品国产亚洲AV无码偷窥| 亚洲国产精久久久久久久| 久久精品国产亚洲AV无码偷窥| 久久亚洲精品成人av无码网站| 亚洲精品人成电影网| 亚洲乱码一区av春药高潮| 亚洲小说图片视频| 涩涩色中文综合亚洲| 亚洲国产欧洲综合997久久| 精品国产日韩亚洲一区91| 黄色a级免费网站| 中国国语毛片免费观看视频|