亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

利用 Java 存儲過程簡化數據庫操作

2019-11-18 12:05:48
字體:
來源:轉載
供稿:網友

  利用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)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美韩日一区二区| xx视频.9999.com| 国产精品久久久久久av福利软件| 狠狠色狠狠色综合日日小说| 国产成人精品网站| 亚洲国产欧美在线成人app| 国产精品一区二区久久国产| 国产精品久久久久久久久影视| 一区二区三区精品99久久| 国产狼人综合免费视频| 欧美成人精品影院| 国产精品三级美女白浆呻吟| 欧美极品欧美精品欧美视频| 亚洲天堂免费视频| 久久97精品久久久久久久不卡| 91精品国产91久久久久久不卡| 日韩欧美aⅴ综合网站发布| 亚洲成人a**站| 国产精品免费视频xxxx| 亚洲精品98久久久久久中文字幕| 欧美亚洲国产视频小说| 国产91精品不卡视频| 久久久久久久久久久久av| 久久精品2019中文字幕| 亚洲精品之草原avav久久| 日韩中文综合网| 精品久久久999| 亚洲情综合五月天| 奇米四色中文综合久久| 亚洲丁香婷深爱综合| 97成人精品视频在线观看| 亚洲欧美日韩国产中文| 国产午夜精品视频| 成人免费淫片视频软件| 国产成人中文字幕| 精品久久久久久久久久国产| 亚洲天堂免费视频| 欧美黑人一级爽快片淫片高清| 欧美性xxxx极品高清hd直播| 欧美麻豆久久久久久中文| 一本色道久久综合亚洲精品小说| 亚洲成人久久久久| 日韩国产一区三区| 亚洲国产欧美在线成人app| 黄色成人在线免费| 精品福利在线视频| 琪琪亚洲精品午夜在线| 国内精品久久久久久久久| 色与欲影视天天看综合网| 热re99久久精品国产66热| 国产精品久在线观看| 久久久久久久一区二区| 91精品国产91久久久| 亚洲第一av在线| 国产精品久久久久久五月尺| 深夜精品寂寞黄网站在线观看| 欧美成人免费一级人片100| 日韩在线观看免费高清| 欧美电影在线观看完整版| 亚洲精品成a人在线观看| 亚洲精品福利在线观看| 少妇av一区二区三区| 国内精品久久久久久久| 久久久极品av| 成人网欧美在线视频| 91久久久国产精品| 成人免费看片视频| 亚洲性视频网站| 疯狂欧美牲乱大交777| 欧美精品xxx| 亚洲综合社区网| 亚洲国产欧美一区| 欧美成人免费大片| 久久久999国产精品| 亚洲福利视频网| 久久av在线看| 国产精品video| 亚洲跨种族黑人xxx| 精品少妇一区二区30p| 国产精品日韩在线| 精品中文字幕乱| 久久伊人精品一区二区三区| 情事1991在线| 91社影院在线观看| 国产精品久久久久久一区二区| 国产精品视频公开费视频| 欧美日韩国产激情| 欧美精品激情在线观看| 久久国产精品久久国产精品| 精品无码久久久久久国产| 在线观看视频亚洲| 91sa在线看| 欧美日本高清一区| 亚洲国产精品福利| 日韩在线观看免费高清完整版| 国产成人自拍视频在线观看| 国产精品久久久久一区二区| 激情懂色av一区av二区av| 国产成人一区二区三区| 精品无人区太爽高潮在线播放| 国内久久久精品| 菠萝蜜影院一区二区免费| 日韩av在线导航| 成人在线精品视频| 日本高清+成人网在线观看| 精品国偷自产在线视频99| 久久精品中文字幕免费mv| 日本亚洲欧洲色α| 亚洲第一在线视频| 福利视频导航一区| 日本亚洲欧洲色α| 日韩亚洲精品视频| 日韩一区二区三区在线播放| 萌白酱国产一区二区| 成人久久久久爱| 成人免费在线网址| 91香蕉嫩草神马影院在线观看| 欧美裸体xxxx极品少妇软件| 国产精品久久久av久久久| 久久久女人电视剧免费播放下载| 国产精品免费一区二区三区都可以| 成人福利网站在线观看| 欧美激情在线狂野欧美精品| 欧美最猛性xxxxx免费| 2020久久国产精品| 亚洲国产日韩欧美综合久久| 91精品视频一区| 日韩极品精品视频免费观看| www亚洲欧美| 精品亚洲一区二区三区在线观看| 日韩激情在线视频| 欧美午夜精品久久久久久久| 91在线精品播放| 国产午夜精品全部视频在线播放| 欧美性色xo影院| 久久久久国产精品一区| 国产视频精品免费播放| 97国产精品人人爽人人做| 亚洲人永久免费| 亚洲一区二区三区毛片| 久久人人看视频| 全亚洲最色的网站在线观看| 97视频免费看| 欧美亚洲激情视频| 午夜精品在线观看| 欧美成人午夜视频| 国产美女久久精品香蕉69| 一本色道久久综合狠狠躁篇怎么玩| 大伊人狠狠躁夜夜躁av一区| 午夜精品一区二区三区在线播放| 日韩视频在线观看免费| 国产精品最新在线观看| 欧美精品久久久久久久免费观看| 久久99久国产精品黄毛片入口| 中文字幕日韩高清| 国产美女精品视频免费观看| 国产一区二区三区在线观看视频| 久久激情五月丁香伊人| 久久综合88中文色鬼| 欧美野外猛男的大粗鳮| 97激碰免费视频| 91国产在线精品| 精品国产一区二区三区久久狼黑人| 美日韩精品免费视频|