N Tier體系結構解決方案
2024-07-21 02:33:30
供稿:網友
企業級N Tier體系結構解決方案討論:NT+Oracle
Oracle可以說是現在業界內最為常見也是最為成功的關系數據庫(DBMs)產品。說它成功,一是因為它的性能優越,二是它的平臺支持最為廣泛,三是它為常見的前臺開發工具提供了應用的接口。在這里,我還要談一個問題,那就是我在這篇討論方案的文章中,對于前臺的解決方法,只討論asp和jsp,為什么不討論現在很流行的php呢?因為我覺得,作為一種SCRipT語言,上述的三種方案沒有太大的差別,這里的差別主要是指功能上的差別,而不去關心性能上的微小差異。有人專門測試了幾種方案毫秒級的數值差異,我個人覺得這里的性能主要取決于第三層(數據庫)上的性能,這時的差異是我們可以深刻體會到的(笑)。其實更為重要的是每種解決方案所支持的元件模型。ASP支持ActiveX,而JSP支持javaBean,這兩種元件都有巨大的支持。例如標準的ASP不支持文件上傳的功能,我們就可以開發一個文件上傳的組件,同樣的情況在JSP中也能實現。PHP呢?可以是可以的,但需要做的工作就不僅僅是開發組件那么簡單了。所以前面的兩種方案明顯有很大的優勢。
本篇討論的是使用ADO模型,通過ODBC的方法與Oracle相連,當然我們也可以使用Oracle使用的專用模型(OO4O),我們會在后面討論。既然使用的是ADO模型,所以我們可以很快的從前面的SQL Server中過渡過來。語法都是相同的,對象當然也是相同的。所以我就只需要指出不同的地方,和它非凡的地方就可以了。其實,我們更應該關注的兩種DBMs之間的差別,也正是DBMs之間的差別才造成了方案之間的差別。兩種DBMs都支持Standerd SQL,但它們又都各自擴展了標準SQL的功能,形成了自己獨特的SQL——SQL Server的Transaction SQL和Oracle的PL/SQL。它們都提供了例如StoredPRocedure、Trigger等等對象,這些也是我們要重點討論的地方。Oracle的PL/SQL在語法上更輕易理解。下面我來舉一個例子,這個例子若用常規的方法要使用多次的數據庫連接,很是麻煩,下面看問題的描述:
這是一個修改密碼的例子,要求我們先輸入以前的密碼,只有在輸入與以前的密碼吻合時才更新新的密碼。程序有三個輸入,舊的密碼,新的密碼,以及確認的密碼。新密碼與確認密碼的吻合我們不用數據庫來驗證,但舊密碼是必須從數據庫中讀出的。用傳統的方法,起碼要用到兩個SQL語句,但寫成一個Oracle的Procedure就可以象下面所示的那樣。
Create or Replace Procedure proc_pass_change
( member_id in varchar2,
org_pass in varchar2,
new_pass in varchar2,
status out number ‘status是一個標志量,當為0時表示成功,1代表舊密碼不符,其它的值代表過程出錯。
)is
tmp_pass varchar2(20);
begin
select mem_pass into tmp_pass from personal_beadroll
where mem_id=member_id;
if tmp_pass=org_pass then
update mem_pass=new_pass from personal_beadroll
where mem_id=member_id;
status:=0;
else
status:=1;
end if;
commit;
exception
when others then
rollback;
status:=2;
raise;
end;
上面的這個Procedure中定義了一個中間的變量tmp_pass,使用這個中間變量來保存第一個Select into語句選出的數據庫中的舊有密碼,然后用它和用戶的輸入做比較,假如是正確的就執行更新的過程,否則返回一個用于判定的過程值。為什么要用Select into呢?這是因為在Procedure中不支持選出一個記錄集,而Select into其實是一個隱含的Cursor,所以我們還可以這樣來實現剛才的這個Procedure:
Create or Replace Procedure proc_pass_change
( member_id in varchar2,
org_pass in varchar2,
new_pass in varchar2,
status out number ‘status是一個標志量,當為0時表示成功,1代表舊密碼不符,其它的值代表過程出錯。
)is
Cursor csr_pass is
Select mem_pass from personal_beadroll
Where mem_id=member_id and mem_pass=org_pass;
begin
open csr_pass;
if csr_pass%FOUND then
update mem_pass=new_pass from personal_beadroll
where mem_id=member_id;
status:=0;
else
status:=1;
end if;
commit;
close csr_pass;
exception
when others then
rollback;
status:=2;
raise;
end;
它的實現思想是,首先我們產生一個密碼和ID都符合的記錄集,若這個記錄集存在的話,就證實了該用戶輸入的原始密碼有效,此時csr_pass%FOUND條件為真,于是我們就可以進行密碼的更新工作了。
從上面的例子我們可以看到,當我們的事務是復雜的SQL語句時,我們使用Procedure的優越性是明顯的。