<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開發人員 JAVA存儲過程
    利用Java存儲過程簡化數據庫操作

    作者:Kuassi Mensah

    利用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/tiger SQL> create or replace function helloworld return VARCHAR2 as language java name 'Hello.world () return java.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 IN varchar, 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存儲過程的更多信息
    本文摘自白皮書"釋放Java存儲過程的能量(Unleash the Power of Java Stored Procedures)",可以在以下位置找到該白皮書:
    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

    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

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

    了解作為Web服務的存儲過程
    otn.oracle.com/tech/webservices
    ?


    擴展數據庫的功能

    在數據庫中直接運行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)。運行于中間層的商務邏輯和運行于數據庫層的數據邏輯之間的分離提高了應用程序的可擴展性、靈活性和可維護性。

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

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

    留言簿(2)

    隨筆分類(67)

    文章分類(43)

    Good Article

    Good Blogs

    Open Source

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲自偷自偷精品| 亚洲精品无码专区2| 亚洲欧洲自拍拍偷午夜色| 亚欧洲精品在线视频免费观看 | 亚洲欧洲自拍拍偷精品 美利坚| 亚洲国产精品99久久久久久| 日韩在线免费电影| 美女视频黄a视频全免费网站色 | 三级片免费观看久久| 亚洲AV蜜桃永久无码精品| 免费一级毛suv好看的国产网站| 亚洲精品无码专区2| 久久精品视频免费播放| 亚洲国产一区二区a毛片| 波多野结衣在线免费视频| 亚洲精品免费网站| 免费在线黄色网址| 国产免费无码AV片在线观看不卡| 午夜影视日本亚洲欧洲精品一区| 蜜桃视频在线观看免费视频网站WWW| 亚洲日本va在线观看| 国产成人免费一区二区三区| 国产精品黄页免费高清在线观看 | 亚洲一级毛片免观看| 日韩免费视频网站| 一级看片免费视频囗交| 久热综合在线亚洲精品| 免费国产成人高清在线观看网站 | 五月天网站亚洲小说| 国产情侣激情在线视频免费看| 亚洲欧洲精品成人久久曰| 亚洲 自拍 另类小说综合图区| 免费国产在线视频| 亚洲熟妇丰满xxxxx| 亚洲中文字幕无码不卡电影| 3d成人免费动漫在线观看 | 另类免费视频一区二区在线观看| 亚洲制服在线观看| 久久久久无码专区亚洲av| 亚洲高清中文字幕免费| 国产久爱免费精品视频|