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

首頁 > 開發 > Java > 正文

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

2024-07-21 02:06:07
字體:
來源:轉載
供稿:網友
 利用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/tigersql> create or replace function helloworld returnvarchar2 as language java name 'hello.world () returnjava.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 invarchar, 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操作??梢杂靡韵?個步驟實現這一模式:

創建并啟動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代碼的一個妙處就在于要實現新的功能,只需要簡單地加載代碼或庫,并利用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)。運行于中間層的商務邏輯和運行于數據庫層的數據邏輯之間的分離提高了應用程序的可擴展性、靈活性和可維護性。
注冊會員,創建你的web開發資料庫,
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色偷偷亚洲男人天堂| 亚洲社区在线观看| 欧美高清第一页| 国产91色在线| 国产综合香蕉五月婷在线| 国产精品扒开腿做爽爽爽视频| 国产+人+亚洲| 国产aaa精品| 色av中文字幕一区| 中文字幕一区日韩电影| 68精品国产免费久久久久久婷婷| 欧美日韩裸体免费视频| 欧美性视频精品| 久久99久国产精品黄毛片入口| 欧美国产日韩免费| 亚洲精品成a人在线观看| 亚洲乱码国产乱码精品精天堂| 日韩av在线播放资源| 国内外成人免费激情在线视频网站| 日本欧美在线视频| 国产精品久久久久久久久久久久久| 国内精品久久久久久中文字幕| 国产91色在线播放| 亚洲精品美女在线| 亚洲国产精品人人爽夜夜爽| 亚洲999一在线观看www| 亚洲国产精品va在看黑人| 久久69精品久久久久久国产越南| 日韩在线一区二区三区免费视频| 一本色道久久综合狠狠躁篇怎么玩| 另类天堂视频在线观看| 欧美性猛交xxxx免费看| 91sao在线观看国产| 97香蕉超级碰碰久久免费软件| 69**夜色精品国产69乱| 97成人精品区在线播放| 成人国产精品一区二区| 26uuu另类亚洲欧美日本一| 久久免费视频在线观看| 日本一欧美一欧美一亚洲视频| 在线日韩欧美视频| 欧美成人免费全部观看天天性色| 欧美一级免费视频| 色综合久久久888| 日韩亚洲一区二区| 亚洲理论片在线观看| 亚洲午夜精品久久久久久性色| 国产精品27p| 亚洲国产精品小视频| 在线观看精品国产视频| 欧美在线视频一区二区| 色播久久人人爽人人爽人人片视av| 日日摸夜夜添一区| 久久这里只有精品99| 久久久综合av| 亚洲韩国日本中文字幕| 一区二区三区精品99久久| 久久男人资源视频| 欧美一区二区三区四区在线| 日本高清不卡在线| 在线电影av不卡网址| 国产精品第8页| 中文字幕久久久av一区| 亚洲国产精品va在线观看黑人| 成人免费高清完整版在线观看| 日韩精品久久久久久福利| 成人福利视频在线观看| 国产成人免费av电影| 久久视频国产精品免费视频在线| 国产成人av在线播放| 日韩中文字幕免费视频| 不卡av电影在线观看| 自拍偷拍亚洲欧美| 久久久久久亚洲精品不卡| 国产亚洲欧美aaaa| 97在线看免费观看视频在线观看| 91av国产在线| 国产综合在线看| 久久精品国产成人精品| 疯狂蹂躏欧美一区二区精品| 亚洲精品久久久久中文字幕二区| 亚洲欧洲一区二区三区久久| 国产精品成人va在线观看| 亚洲国产欧美自拍| 久久精品视频在线| 红桃av永久久久| 亚洲www在线观看| 日韩av在线免费播放| 日韩欧美高清视频| 97精品视频在线播放| 亚洲欧美激情在线视频| 91国内在线视频| 久久久女人电视剧免费播放下载| 国产男女猛烈无遮挡91| 国产精品久久久久7777婷婷| 久久久亚洲精选| 国产成人在线精品| 欧美激情视频网址| 欧美日韩国产专区| 91麻豆国产语对白在线观看| 伊人精品在线观看| 美日韩精品免费视频| 欧美精品999| 91高清视频免费| 欧美日韩国产成人在线| 国产亚洲精品美女久久久| 亚洲另类xxxx| 欧美性猛交xxxx| 欧美精品久久久久| 欧美极品少妇全裸体| 亚洲欧美色婷婷| 国产一区二区欧美日韩| 欧美在线一区二区三区四| 日本久久中文字幕| 国产一区二区三区视频| 欧美成人精品在线播放| 亚洲精品中文字| 中文字幕综合在线| 日韩av不卡电影| 国产精品亚洲欧美导航| 日韩精品免费在线播放| 国产成人精品免高潮费视频| 欧美激情精品久久久久久| 成人写真视频福利网| 成人免费高清完整版在线观看| 国产狼人综合免费视频| 性夜试看影院91社区| 91热精品视频| 国产有码在线一区二区视频| 69**夜色精品国产69乱| 日韩一区二区福利| 日韩在线观看成人| 91精品视频在线播放| 操日韩av在线电影| 欧美精品xxx| 欧美日韩一区二区在线播放| 亚洲欧美国产精品久久久久久久| 韩国19禁主播vip福利视频| 日本一区二区三区在线播放| 91视频-88av| 久久久久久国产| 久久91超碰青草是什么| 成人免费在线网址| 国产亚洲一级高清| 亚洲精品欧美日韩| 日韩在线一区二区三区免费视频| 欧美色图在线视频| 亚洲女成人图区| 亚洲成人精品久久久| 91美女高潮出水| 欧美日韩精品在线观看| 色悠悠国产精品| 亚洲成成品网站| 亚洲精品在线观看www| 欧美日韩爱爱视频| 亚洲影院色在线观看免费| 国产乱肥老妇国产一区二| 亚洲一区久久久| 亚洲视频欧美视频| 久久精品国产亚洲精品2020| 国产欧美精品va在线观看| 91欧美视频网站| 国产99久久精品一区二区 夜夜躁日日躁| 欧美在线观看日本一区|