#
通常,你需要獲得當(dāng)前日期和計算一些其他的日期,例如,你的程序可能需要判斷一個月的第一天或者最后一天。你們大部分人大概都知道怎樣把日期進行分割
(年、月、日等),然后僅僅用分割出來的年、月、日等放在幾個函數(shù)中計算出自己所需要的日期!在這篇文 章里,我將告訴你如何使用DATEADD和
DATEDIFF函數(shù)來計算出在你的程序中可能你要用到的一些不同日期。
在使用本文中的例子之前,你必須注意以下的問題。大部
分可能不是所有例子在不同的機器上執(zhí)行的結(jié)果可能不一樣,這完全由哪一天是一個星期的第一天這個設(shè)置決定。第一天(DATEFIRST)設(shè)定決定了你的系
統(tǒng)使用哪一天作為一周的第一天。所有以下的例 子都是以星期天作為一周的第一天來建立,也就是第一天設(shè)置為7。假如你的第一天設(shè)置不一樣,你可能需要調(diào)整
這些例子,使它和不同的第一天設(shè)置相符合。你可以通過@@DATEFIRST函數(shù)來檢查第一天設(shè)置。
為了理解這些例子,
我們先復(fù)習(xí)一下DATEDIFF和DATEADD函數(shù)。DATEDIFF函數(shù)計算兩個日期之間的小時、天、周、月、年等時間間隔總數(shù)。DATEADD函數(shù)
計算一個日期通過給時間間隔加減來獲得一個新的日期。要了解更多的DATEDI FF和DATEADD函數(shù)以及時間間隔可以閱讀微軟聯(lián)機幫助。
使用DATEDIFF和DATEADD函數(shù)來計算日期,和本來從當(dāng)前日期轉(zhuǎn)換到你需要的日期的考慮方法有點不同。你必須從時間間隔這個方面來考慮。比
如,從當(dāng)前日期到你要得到的日期之間有多少時間間隔,或者,從今天到某一天(比如1900-1-1)之間有多少時間間隔,等等。理解怎樣著眼于時間間隔有
助于你輕松的理解我的不同的日期計算例子。
一個月的第一天
第一個例子,我將告訴你如何從當(dāng)前日期去這個月的最后一天。請注意:這個例子以及這篇文章中的其他例子都將只使用DATEDIFF和DATEADD函數(shù)來計算我們想要的日期。每一個例子都將通過計算但前的時間間隔,然后進行加減來得到想要計算的日期。
這是計算一個月第一天的SQL 腳本:
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
我們把這個語句分開來看看它是如何工作的。最核心的函數(shù)是getdate(),大部分人都知道這個是返回當(dāng)前的日期和時間的函數(shù)。下一個執(zhí)行的函數(shù)
DATEDIFF(mm,0,getdate())是計算當(dāng)前日期和“1900-01-01 00:00:00.000”這個日期之間的月數(shù)。記住:時期
和時間變量和毫秒一樣是從“1900-01-01 00:00:00.000”開始計算的。這就是為什么你可以在DATEDIFF函數(shù)中指定第一個時間表
達式為“0”。下一個函數(shù)是DATEADD,增加當(dāng)前日期到“1900-01-01”的月數(shù)。通過增加預(yù)定義的日期“1900-01-01”和當(dāng)前日期的
月數(shù),我們可以獲得這個月的第一天。另外,計算出來的日期的時間部分將會是“00:00:00.000”。
這個計算的技巧是先計算當(dāng)前日期到“1900-01-01”的時間間隔數(shù),然后把它加到“1900-01-01”上來獲得特殊的日期,這個技巧可以用來計算很多不同的日期。下一個例子也是用這個技巧從當(dāng)前日期來產(chǎn)生不同的日期。
本周的星期一
這里我是用周(wk)的時間間隔來計算哪一天是本周的星期一。
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
一年的第一天
現(xiàn)在用年(yy)的時間間隔來顯示這一年的第一天。
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
季度的第一天
假如你要計算這個季度的第一天,這個例子告訴你該如何做。
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
當(dāng)天的半夜
曾經(jīng)需要通過getdate()函數(shù)為了返回時間值截掉時間部分,就會考慮到當(dāng)前日期是不是在半夜。假如這樣,這個例子使用DATEDIFF和DATEADD函數(shù)來獲得半夜的時間點。
SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)
深入DATEDIFF和DATEADD函數(shù)計算
你可以明白,通過使用簡單的DATEDIFF和DATEADD函數(shù)計算,你可以發(fā)現(xiàn)很多不同的可能有意義的日期。
目前為止的所有例子只是僅僅計算當(dāng)前的時間和“1900-01-01”之間的時間間隔數(shù)量,然后把它加到“1900-01-01”的時間間隔上來計算出
日期。假定你修改時間間隔的數(shù)量,或者使用不同的時間間隔來調(diào)用DATEADD函數(shù),或者減去時間間隔而不是增加,那么通過這些小的調(diào)整你可以發(fā)現(xiàn)和多不
同的日期。
這里有四個例子使用另外一個DATEADD函數(shù)來計算最后一天來分別替換DATEADD函數(shù)前后兩個時間間隔。
上個月的最后一天
這是一個計算上個月最后一天的例子。它通過從一個月的最后一天這個例子上減去3毫秒來獲得。有一點要記住,在Sql Server中時間是精確到3毫秒。這就是為什么我需要減去3毫秒來獲得我要的日期和時間。
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
計算出來的日期的時間部分包含了一個Sql Server可以記錄的一天的最后時刻(“23:59:59:997”)的時間。
去年的最后一天
連接上面的例子,為了要得到去年的最后一天,你需要在今年的第一天上減去3毫秒。
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
本月的最后一天
現(xiàn)在,為了獲得本月的最后一天,我需要稍微修改一下獲得上個月的最后一天的語句。修改需要給用DATEDIFF比較當(dāng)前日期和“1900-01-01”
返回的時間間隔上加1。通過加1個月,我計算出下個月的第一天,然后減去3毫秒,這樣就計算出了這個月的最后一天。這是計算本月最后一天的SQL腳本。
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))
本年的最后一天
你現(xiàn)在應(yīng)該掌握這個的做法,這是計算本年最后一天腳本
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。
本月的第一個星期一
好了,現(xiàn)在是最后一個例子。這里我要計算這個月的第一個星期一。這是計算的腳本。
select DATEADD(wk, DATEDIFF(wk,0,
dateadd(dd,6-datepart(day,getdate()),getdate())
), 0)
在這個例子里,我使用了“本周的星期一”的腳本,并作了一點點修改。修改的部分是把原來腳本中“getdate()”部分替換成計算本月的第6天,在計算中用本月的第6天來替換當(dāng)前日期使得計算可以獲得這個月的第一個星期一。
總結(jié)
我希望這些例子可以在你用DATEADD和DATEDIFF函數(shù)計算日期時給你一點啟發(fā)。通過使用這個計算日期的時間間隔的數(shù)學(xué)方法,我發(fā)現(xiàn)為了顯示兩
個日期之間間隔的有用歷法是有價值的。注意,這只是計算出這些日期的一種方法。要牢記,還有很多方法 可以得到相同的計算結(jié)果。假如你有其他的方法,那很
不錯,要是你沒有,我希望這些例子可以給你一些啟發(fā),當(dāng)你要用DATEADD和DATEDIFF函數(shù)計算你程序可能要用到的日期時。
附錄,其他日期處理方法
1)去掉時分秒
declare @ datetime
set @ = getdate() --’2003-7-1 10:00:00’
SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0)
2)顯示星期幾
select datename(weekday,getdate())
3)如何取得某個月的天數(shù)
declare @m int
set @m=2 --月份
select datediff(day,’2003-’+cast(@m as varchar)+’-15’ ,’2003-’+cast(@m+1 as varchar)+’-15’)
另外,取得本月天數(shù)
select datediff(day,cast(month(GetDate()) as varchar)+’-’+cast(month(GetDate()) as varchar)+’-15’ ,cast(month(GetDate()) as varchar)+’-’+cast(month(GetDate())+1 as varchar)+’-15’)
或者使用計算本月的最后一天的腳本,然后用DAY函數(shù)區(qū)最后一天
SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)))
4)判斷是否閏年:
SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) when 28 then ’平年’ else ’閏年’ end
或者
select case datediff(day,datename(year,getdate())+’-02-01’,dateadd(mm,1,datename(year,getdate())+’-02-01’))
when 28 then ’平年’ else ’閏年’ end
5)一個季度多少天
declare @m tinyint,@time smalldatetime
select @m=month(getdate())
select @m=case when @m between 1 and 3 then 1
when @m between 4 and 6 then 4
when @m between 7 and 9 then 7
else 10 end
select @time=datename(year,getdate())+’-’+convert(varchar(10),@m)+’-01’
select datediff(day,@time,dateadd(mm,3,@time))
The load-on-startup element indicates that this servlet should be loaded (instantiated and have its init() called) on the startup of the web application. The optional contents of these element must be an integer indicating the order in which the servlet should be loaded. If the value is a negative integer, or the element is not present, the container is free to load the servlet whenever it chooses. If the value is a positive integer or 0, the container must load and initialize the servlet as the application is deployed.
The container must guarantee that servlets marked with lower integers
are loaded before servlets marked with higher integers. The container
may choose the order of loading of servlets with the same
load-on-start-up value.
SOA現(xiàn)在正熱得"燙手"。
對于SOA,目前我聽到有兩種說法:一種講它是"顛覆性的革命架構(gòu)",一種是"謹慎觀望"。但無疑,SOA最近幾年發(fā)展得非常快,各主要軟件廠商紛紛高調(diào)跟進,關(guān)于SOA的報道可以說是不絕于耳。對"SOA熱",程序員們有的興奮和期待,有的則感到困惑,最近我在金蝶中間件于廣州、上海等城市舉行的"Java俱樂部"上和程序員們交流時,他們或是以一種朝圣者的表情說:"以前面向?qū)ο蟮募夹g(shù)過時了,SOA時代來了",或者一再懇切地追問我:"SOA到底是什么?作用是什么?"
那么,SOA是什么?到底能解決什么問題、解決得怎樣?我們和客戶都準(zhǔn)備好了嗎?我給出的答案是"Just Processing,SOA-現(xiàn)在進行中"。
SOA到底是什么?
SOA(Service-Oriented Architecture)的定義是面向服務(wù)的架構(gòu),就是說將軟件按照功能設(shè)計成一個個服務(wù),這些服務(wù)用標(biāo)準(zhǔn)的方式定義接口、并通過標(biāo)準(zhǔn)的協(xié)議進行調(diào)用。SOA所定義的接口和調(diào)用方式是獨立于編程語言和運行平臺的,廣義上講SOA可以基于不同的底層技術(shù)實現(xiàn),比如CORBA和Web Services。但CORBA由于過于復(fù)雜和臃腫已很少使用,所以目前所說的SOA絕大多數(shù)是基于Web Services技術(shù)實現(xiàn)。在Web Services的實現(xiàn)方式下,SOA服務(wù)的接口用XML進行定義。
在SOA架構(gòu)下,軟件開發(fā)從業(yè)務(wù)流程分析開始,使用組件化業(yè)務(wù)建模的方法識別和分析各種業(yè)務(wù)模型,將各種實踐融入其中,在這個基礎(chǔ)上建立用例,用例直接產(chǎn)生BPEL,這些BPEL則可以被融入一個服務(wù)整合框架中,其描述了各種服務(wù)的信息,從而把ESB上的各個模塊統(tǒng)一起來,形成一個巨大的服務(wù)倉。
這樣,SOA甚至是所有軟件人員的一個夢:將中間層再進行抽離,在中間層作一個跨技術(shù)架構(gòu)的元數(shù)據(jù)和業(yè)務(wù)邏輯,使之成為跨技術(shù)架構(gòu)的、可長期繼承、并不斷積累的企業(yè)業(yè)務(wù)庫和最寶貴的信息資產(chǎn),也就是面向服務(wù)的組件庫,而且這個服務(wù)組件庫也可以被其它企業(yè)復(fù)用,且不依賴于任何一種技術(shù)架構(gòu)。夸張一點說,如果所有軟件企業(yè)都使用SOA架構(gòu),那么世界軟件業(yè)將會發(fā)生徹底的改變。顯然,這樣一個框架不是一種產(chǎn)品,也不僅僅是一種技術(shù),而是一種解決問題的方法論。
SOA可能應(yīng)用的兩個場景及現(xiàn)有問題
那么,SOA要解決的問題是什么?我認為,從技術(shù)本質(zhì)上講,SOA可能應(yīng)用于兩個場景:第一種是業(yè)務(wù)互通互聯(lián);第二種是封閉交易系統(tǒng),即將元數(shù)據(jù)和業(yè)務(wù)邏輯抽離,形成可復(fù)用。舉個例子,在第一種場景中,當(dāng)不同企業(yè)之間的業(yè)務(wù)需要相互調(diào)用,這時就可能采用SOA技術(shù);在第二種場景中,在企業(yè)內(nèi)部需要將系統(tǒng)進行遷移時,利用SOA技術(shù)定義的原有數(shù)據(jù)和業(yè)務(wù)流程,可以很快完成。
無疑,SOA是一個偉大的思想,它試圖定義一個大家(各種軟件廠商)都"認"的、都"遵循"的法則,大家都使用這樣的方法來進行互聯(lián)互通,從而實現(xiàn)無界限的聯(lián)通,以及服務(wù)組件庫的繼承和復(fù)用,解放無效和重復(fù)勞動。打一個不那么恰當(dāng)?shù)谋扔鳎拖袢祟惖恼Z言一樣。SOA或許就像《圣經(jīng)》中那個著名的"通天塔"的故事:人們用同一種語言交流產(chǎn)生的威力是如此之大,以至于他們在巴比倫幾乎要修成一個"通天塔",直達上帝所在的天庭。
但是,在SOA應(yīng)用的兩個場景中,現(xiàn)存的問題同樣也是明顯的:
第一種場景:業(yè)務(wù)互聯(lián)互通,就是應(yīng)用系統(tǒng)互聯(lián)。業(yè)務(wù)互聯(lián),與其說是技術(shù)問題,不如講是業(yè)務(wù)問題,例如ERP、CRM的異步整合,數(shù)據(jù)層面整合都不能很好將兩個系統(tǒng)整合,SOA僅僅是一種實現(xiàn)工具之一,整合效果并不會好不到那里去。我們可以說,在沒有其他選項之前,SOA是一種最"不壞"的方式,但它并不能解決所有的問題,實際上EAI的牽涉面很廣,而我們知道,有些問題并不是單純靠技術(shù)就能解決的。
第二種場景:封閉交易系統(tǒng),缺點是性能慢,而且基于Web Services的交易沒有形成明確的規(guī)范。使用XML作信息交互比較慢是大家都承認的,性能問題將對SOA的發(fā)展造在一定的阻力。同時SOA規(guī)范本身沒有完善,比如Transaction規(guī)范還在不斷完善,而且Web Service多年來收效甚微。總的來說,SOA現(xiàn)在還處在一個發(fā)展階段,很多標(biāo)準(zhǔn)還在制定,不同廠商間還存在不兼容的現(xiàn)象,因此SOA還不能說已經(jīng)是一個成熟的技術(shù),還需要時間的檢驗,還在"進行中"。當(dāng)然,金蝶中間件作為JCP組織成員,也會推動SOA規(guī)范在J2EE平臺上的實現(xiàn)。
中國用戶的現(xiàn)實選擇之惑
在憧憬SOA技術(shù)可能帶來的前景之余,我們不得不回過頭來冷靜地說:SOA和我們大家的共同客戶――中國企業(yè)還有距離。
中國信息化進程與歐美不同,大量的基礎(chǔ)業(yè)務(wù)系統(tǒng)還沒建立起來,整合需求并不如想象的那么大。從我們對客戶的了解,發(fā)現(xiàn)很少有客戶有SOA的需求。簡單地總結(jié)就是,互通無基礎(chǔ),以新建系統(tǒng)為主,需求并不強烈。而歐美市場大量業(yè)務(wù)系統(tǒng)已建立起來需要整合,從這個角度講,SOA是適用于他們的。同時,在成功案例極少的前提下,SOA還處于培育期,新建封閉交易系統(tǒng)使用SOA技術(shù)還是有一定風(fēng)險的。
一項新技術(shù)需要市場的消化,大型企業(yè)出于保護企業(yè)投資,不會輕易地轉(zhuǎn)移到新的技術(shù)平臺;而即使像J2EE這樣成熟的技術(shù)經(jīng)過了這么多年的發(fā)展,也不敢說占有統(tǒng)治地位的市場份額。SOA還需要整個IT界的用戶和供應(yīng)商共同促進。
中國信息化需要什么樣的技術(shù)架構(gòu)、能夠接受什么樣的成本價位?這不僅僅是我們的客戶需要考慮,我們軟件廠商要比客戶考慮得更清楚、更進一步。在這個充滿變數(shù)的激烈競爭市場,只有冷靜務(wù)實才能生存、發(fā)展。
From:http://blog.csdn.net/Apusicyuan/archive/2007/03/16/1531424.aspx
解析SOA十大設(shè)計原則 公共接口要明確界限
作者: 佚名, 出處:CSDN, 責(zé)任編輯: 包春林,
2008-04-23 05:00
日前國外網(wǎng)站報道介紹了面向服務(wù)架構(gòu)(SOA)的基本原則,提出了公共接口與內(nèi)部實現(xiàn)要有明確界限等原則。雖然這些原則并不是絕對的真理,但可作為一個應(yīng)用開發(fā)參考。
一、明確的邊界
通過跨越定義明確的邊界進行顯式消息傳遞,服務(wù)得以彼此交互。有時候,跨越服務(wù)邊界可能要耗費很大的成本,這要視地理、信任或執(zhí)行因素而定。邊界是指服務(wù)的公共接口與其內(nèi)部專用實現(xiàn)之間的界線。服務(wù)的邊界通過 WSDL 發(fā)布,可能包括說明特定服務(wù)之期望的聲明。
二、服務(wù)共享和約和架構(gòu),不是類
服務(wù)交互應(yīng)當(dāng)只以服務(wù)的策略、架構(gòu)和基于合約的行為為基礎(chǔ)。服務(wù)的合約通常使用 WSDL 定義,而服務(wù)聚合的合約則可以使用 BPEL 定義(進而,對聚合的每個服務(wù)使用 WSDL)。服務(wù)使用者將依靠服務(wù)的合約來調(diào)用服務(wù)及與服務(wù)交互。鑒于這種依賴性,服務(wù)合約必須長期保持穩(wěn)定。在利用 XML 架構(gòu) (xsd:any) 和 SOAP 處理模型(可選標(biāo)頭)的可擴展性的同時,合約的設(shè)計應(yīng)盡可能明確。
三、策略驅(qū)動
盡管它往往被認為是最不為人所了解的原則,但對于實現(xiàn)靈活的 Web 服務(wù),它或許是最有力的。單純依靠 WSDL 無法交流某些業(yè)務(wù)交互要求。可以使用策略表達式將結(jié)構(gòu)兼容性(交流的內(nèi)容)與語義兼容性(如何交流消息或者將消息交流給誰)分隔開來。
四、自治
服務(wù)是獨立進行部署、版本控制和管理的實體。開發(fā)人員應(yīng)避免對服務(wù)邊界之間的空間進行假設(shè),因為此空間比邊界本身更容易改變。
五、采用可傳輸?shù)膮f(xié)議格式,而不是API
通常,服務(wù)提供商基于某種傳輸協(xié)議(例如HTTP)提供服務(wù),而服務(wù)消費者只能通過另一種不同的協(xié)議(比如MQ)通信。因此,也許需要在服務(wù)提供商與消費者之間建立一座異步起動同步運行的連接橋梁,超越HTTP和Java Messaging Service消息服務(wù)(JMS)等協(xié)議.從技術(shù)角度講,Java Messaging Service消息服務(wù)(JMS)并不是一種傳輸協(xié)議,而是一組供應(yīng)商中立(vendor-neutral)的通信APIs。
六、面向文檔
消息被構(gòu)造為“純文本的”XML文檔(換句話說,數(shù)據(jù)的格式只對XML有意義)。 消息通常用于傳輸業(yè)務(wù)文檔,比如購買訂單、發(fā)票和提單。這種交互類型與同步消息排隊系統(tǒng)的兼容性很好,比如MQ Series、MSMQ、JMS、TIBCO、IMS等等。
七、松耦合
服務(wù)之間要求最小的依賴性,只要求它們之間能夠相互知曉。
八、符合標(biāo)準(zhǔn)
當(dāng)通過Web的服務(wù)實現(xiàn)時,最原始的(基本的)面向服務(wù)的架構(gòu)(SOA)的模型僅僅提供了很低程度上的關(guān)于可靠性、安全性以及事務(wù)管理的標(biāo)準(zhǔn)化機制。第二代的技術(shù)條件和框架,如WS-ReliableMessaging規(guī)范、 WS-Security規(guī)范和WS-Coordination規(guī)范 (與WS-AtomicTransaction規(guī)范和WS-BusinessActivity規(guī)范相聯(lián)系),它們試圖以工業(yè)標(biāo)準(zhǔn)的方式定位存在的缺陷。
九、獨立軟件供應(yīng)商
向SOA的轉(zhuǎn)變正在深刻改變了經(jīng)濟現(xiàn)實。客戶們會期待更合理的費用以及不必重新進行投資就能改進業(yè)務(wù)的能力。因此,獨立軟件供應(yīng)商沒有選擇,只能使自己的業(yè)務(wù)更加靈活,以期讓自己的客戶也變得同樣靈活。于是,面向服務(wù)不僅是簡單的在現(xiàn)有的、緊耦合的、復(fù)雜的、不靈活的以及非組件化的業(yè)務(wù)功能上添加基于標(biāo)準(zhǔn)的接口。更重要的是,為了兌現(xiàn)SOA的承諾,獨立軟件供應(yīng)商必須改變他們構(gòu)建、打包、銷售、交付、管理和支持自身產(chǎn)品的方式。
十、元數(shù)據(jù)驅(qū)動
開發(fā)元數(shù)據(jù)本身并不是元數(shù)據(jù)驅(qū)動應(yīng)用程序的本意。使用元數(shù)據(jù)來驅(qū)動服務(wù)在系統(tǒng)邊界的傳播是一個更為正確的方法。
一個事務(wù)處理的屬性有:Required,RequiresNew,Mandatory,NotSupported,Supports,Never.
1、Required:當(dāng)客戶端運行一個事務(wù)處理并調(diào)用EJB的一個方法,這個方法執(zhí)行客戶端的事務(wù)處理;當(dāng)客戶端沒有啟動一個事務(wù)處理,則EJB容器在執(zhí)行這個方法之前啟動一個新的事務(wù)處理.
2、RequiresNew:當(dāng)客戶端運行一個事務(wù)處理并調(diào)用EJB的一個方法時,容器管理器做如下操作:
(1) 懸掛客戶端的事務(wù)處理;
(2) 開始一個新的事務(wù)處理;
(3) 調(diào)用方法;
(4) 當(dāng)方法結(jié)束,恢復(fù)客戶端的事物處理.
當(dāng)客戶端沒有啟動一個事務(wù)處理,容器管理器在執(zhí)行這個方法之前啟動一個新的事務(wù)處理.
3、Mandatory: 當(dāng)客戶端運行一個事務(wù)處理并調(diào)用EJB的一個方法,這個方法在客戶端的事務(wù)處理范圍內(nèi)被執(zhí)行; 當(dāng)客戶端沒有啟動一個事務(wù)處理,容器管理器將會拋錯(TransactionRequiredException);
4、NotSupported: 當(dāng)客戶端運行一個事務(wù)處理并調(diào)用EJB的一個方法,容器管理器在調(diào)用方法之前終止客戶端的事務(wù)處理,當(dāng)方法執(zhí)行完,再恢復(fù)客戶端的事務(wù)處理; 當(dāng)客戶端沒有啟動一個事務(wù)處理,容器管理器在調(diào)用方法時不啟動事務(wù)處理.
5、Supports: 當(dāng)客戶端運行一個事務(wù)處理并調(diào)用EJB的一個方法,在運行方法時執(zhí)行客戶端的事務(wù)處理; 當(dāng)客戶端沒有啟動一個事務(wù)處理,容器管理器在調(diào)用方法時不啟動事務(wù)處理.
6、Never: 當(dāng)客戶端運行一個事務(wù)處理并調(diào)用EJB的一個方法,容器管理器將拋出一個錯誤(RemoteException); 當(dāng)客戶端沒有啟動一個事務(wù)處理,容器管理器在調(diào)用方法時不啟動事務(wù)處理.
在jbuilder中,缺省是Required;
第一個ejb可以是 Required,這個ejb調(diào)用的那個ejb方法如果想在一個
事務(wù)上下文中,我覺得可能采用Mandatory,方式比較好。如果它們不在一個事務(wù)上下文中,就會拋錯(TransactionRequiredException),是一個上下文,就沒有問題
幾乎每個做過Web開發(fā)的人都問過,到底元素的ID和Name有什么區(qū)別阿?為什么有了ID還要有Name呢?而同樣我們也可以得到最classical的答案:ID就像是一個人的身份證號碼,而Name就像是他的名字,ID顯然是唯一的,而Name是可以重復(fù)的。
上周我也遇到了ID和Name的問題,在頁面里輸入了一個input type="hidden",只寫了一個ID='SliceInfo',賦值后submit,在后臺用Request.Params["SliceInfo"]卻怎么也去不到值。后來恍然大悟因該用Name來標(biāo)示,于是在input里加了個Name='SliceInfo',就一切ok了。
第一段里對于ID和Name的解答說的太籠統(tǒng)了,當(dāng)然那個解釋對于ID來說是完全對的,它就是Client端HTML元素的Identity。而Name其實要復(fù)雜的多,因為Name有很多種的用途,所以它并不能完全由ID來代替,從而將其取消掉。
具體用途有:
用途1: 作為可與服務(wù)器交互數(shù)據(jù)的HTML元素的服務(wù)器端的標(biāo)示,比如input、select、textarea、和button等。我們可以在服務(wù)器端根據(jù)其Name通過Request.Params取得元素提交的值。
用途2: HTML元素Input type='radio'分組,我們知道radio button控件在同一個分組類,check操作是mutex的,同一時間只能選中一個radio,這個分組就是根據(jù)相同的Name屬性來實現(xiàn)的。
用途3: 建立頁面中的錨點,我們知道link是獲得一個頁面超級鏈接,如果不用href屬性,而改用Name,如:,我們就獲得了一個頁面錨點。
用途4: 作為對象的Identity,如Applet、Object、Embed等元素。比如在Applet對象實例中,我們將使用其Name來引用該對象。
用途5: 在IMG元素和MAP元素之間關(guān)聯(lián)的時候,如果要定義IMG的熱點區(qū)域,需要使用其屬性usemap,使usemap="#name"(被關(guān)聯(lián)的MAP元素的Name)。
用途6: 某些特定元素的屬性,如attribute,和param。例如為Object定義參數(shù)
顯然這些用途都不是能簡單的使用ID來代替掉的,所以HTML元素的ID和Name的卻別并不是身份證號碼和姓名這樣的區(qū)別,它們更本就是不同作用的東西。
當(dāng)然HTML元素的Name屬性在頁面中也可以起那么一點ID的作用,因為在DHTML對象樹中,我們可以使用document.getElementsByName來獲取一個包含頁面中所有指定Name元素的對象數(shù)組。
在這里順便說一下,要是頁面中有n(n>1)個HTML元素的ID都相同了怎么辦?在DHTML對象中怎么引用他們呢?如果我們使用ASPX頁面,這樣的情況是不容易發(fā)生的,因為aspnet進程在處理aspx頁面時根本就不允許有ID非唯一,這是頁面會被拋出異常而不能被正常的render。要是不是動態(tài)頁面,我們硬要讓ID重復(fù)那IE怎么搞呢?
這個時候我們還是可以繼續(xù)使用document.getElementById獲取對象,只不過我們只能獲取ID重復(fù)的那些對象中在HTML Render時第一個出現(xiàn)的對象。而這時重復(fù)的ID會在引用時自動變成一個數(shù)組,ID重復(fù)的元素按Render的順序依次存在于數(shù)組中。
程序題:我想啟動一個線程執(zhí)行特定的任務(wù),任務(wù)的具體執(zhí)行內(nèi)容定義在TheRunnable類中(實現(xiàn)了java.lang.Runnable接口):
TheRunnable theRunnable = new TheRunnable();
以下哪個語句可用于啟動theRunnable任務(wù)線程:_____
a) theRunnable.run();
b) theRunnable.start();
c) Thread thread = new Thread(theRunnable); thread.run();
d) Thread thread = new Thread(theRunnable); thread.start();
前言
全國青少年信息學(xué)(計算機)奧林匹克競賽常常要用到許多經(jīng)典算法,比如約瑟夫問題、螺旋方陣、漢諾塔、八皇后問題等,而 螺旋方陣問題是其中較為常用的一種。這類問題的算法分析對于計算機圖形學(xué)、解析幾何中的相關(guān)問題都有一定的啟發(fā)性。盡管現(xiàn)有算法已取得了令人振奮的成績, 但依然具有一定的片面性,或者說過于復(fù)雜。實際上,這個問題有不同的解決算法,鑒于這個問題具有一定的典型性,本文針對信息學(xué)奧林匹克競賽這一問題進行了 全面系統(tǒng)的分析、歸納,從不同的角度對這個問題的算法進行分析并通過程序?qū)崿F(xiàn)。使讀者對這個問題在算法選擇上有更大的余地,從而避免算法的單一性,同時對 于類似相關(guān)問題的解決也有一定的啟發(fā)和幫助。
2 問題的描述與分析
關(guān)于螺旋方陣的輸出主要是指將一些數(shù)據(jù)或符號按照一定的順序輸出到計算機的屏幕上或者是輸出到一個指定的文件中去,輸出的幾種常見情況如下圖(為簡單起見,以輸出5階的數(shù)字螺旋方陣為例):
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
1 16 15 14 13
2 17 24 25 12
3 18 25 23 11
4 19 20 21 10
5 6 7 8 9
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
21 20 19 18 17
22 7 6 5 16
23 8 1 4 15
24 9 2 3 14
25 10 11 12 13
圖1由外及里順時針;圖2由外及里逆時針;圖3由里及外順時針;圖4由里及外逆時針
在實際應(yīng)用中,輸出的內(nèi)容可以不盡相同。在上面的圖1至圖4中,按螺旋順序輸出的數(shù)顯然有一定的規(guī)律,而實際輸出的順序往往不是按照螺旋順序,通常是將上圖中的數(shù)據(jù)按行(或按列)輸出,因此這類問題的關(guān)鍵在于如何將有規(guī)律的數(shù)據(jù)與實際輸出時的先后順序?qū)?yīng)起來。下面采用不同的算法來實現(xiàn)。
3 采用不同算法解決螺旋方陣的輸出
3.1非遞歸算法
3.1.1 “海龜”算法(順時針,由外及里)
參照海龜行走的做法,用一對變量A,B模擬海龜頭的方向,根據(jù)屏幕坐標(biāo)的特點,A、B的取值和“海龜頭”方向有這樣的關(guān)系:(0,1)表示向右;(0, -1)表示向左;(-1,0)表示向上;(1,0)表示向下;用另一對變量X,Y模擬海龜位置,“海龜”每前進一步,它的新位置即為X=X+A,Y=Y+B;要海龜向右轉(zhuǎn),就改變A、B的值,根據(jù)數(shù)學(xué)知識可以得出具體的變換公式是:C=A;A=B;B=-C。下面用自然語言對算法進行描述:讓海龜先走n步,然后右轉(zhuǎn),再走n-1步,再右轉(zhuǎn),再走n-1步,再右轉(zhuǎn),再走n-2步,再右轉(zhuǎn),再走n-2步……如此類推,直到海龜前進的步數(shù)為0時停止;而每當(dāng)“海龜”前進1步,就在它位置上顯示一個數(shù)字,那么前進n步即重復(fù)執(zhí)行“X:=X+A,Y:=Y+B”語句n次。但如何讓下兩個循環(huán)的重復(fù)次數(shù)都為n-1呢?解決的方法是:循環(huán)n次后,讓n的值減少0.5,然后再轉(zhuǎn)回執(zhí)行同樣的循環(huán)。擴展到顯示n位數(shù),則須留n列的位置,也就是說,海龜水平方向每次得前進n步,才有足夠的位置顯示大一點的數(shù)字方陣,需把Y=Y+B改成Y=Y+n*B就行了。“海龜”算法的優(yōu)點是簡潔清晰。
3.1.2 “分割”算法(逆時針,由外及里)
設(shè)螺旋方陣對應(yīng)的一般二維數(shù)組如下:
a00 a01 a02 a03 a04
a10 a11 a12 a13 a14
a20 a21 a22 a23 a24
a30 a31 a32 a33 a34
a40 a41 a42 a43 a44
圖5
按逆時針方向從外向內(nèi),一層層給下標(biāo)變量賦值,由于階數(shù)n的任意性,需考慮以下幾個問題:層數(shù)k與階數(shù)n的關(guān)系式,n由用戶輸入,k根據(jù)n來計算;定義變量value,賦值時讓其自增;分析每層矩形四條邊元素的下標(biāo)變化規(guī)律,將方陣元素按逆時針方向分成四個部分:方陣左半邊(三列),方陣下半邊(二行),方陣右半邊(兩列),方陣上半邊(二行)。
具體算法思想:以5階方陣為例,可判斷 k=[(n+1)/2]=3,用循環(huán)控制產(chǎn)生的層數(shù),語句為for(k=0,k <(n+1)/2;k++)。
Step1:找出方陣左半邊列規(guī)律:列下標(biāo)正好是層數(shù)k的值,行下標(biāo)在第一列從0變到4,第二列從1變到3,在第三列從2變到2,故推導(dǎo)出n階螺旋方陣左半邊由外到內(nèi)的列循環(huán)結(jié)構(gòu):for(i=k;i <n-k;i++) mat[i][k]=value++;此循環(huán)執(zhí)行一次,產(chǎn)生一列元素,循環(huán)執(zhí)行的次數(shù)由外循環(huán)來控制。
Step2:找出方陣下半邊行規(guī)律:行下標(biāo)從4變到3,每層取值為n―k―1;列下標(biāo)由外到內(nèi)第一行從1變到4(a40已產(chǎn)生),第二行(a30 、a31已產(chǎn)生)從2變到3,第三行只有一個元素a22,故推導(dǎo)出n階螺旋方陣下半邊行循環(huán)結(jié)構(gòu):for(i=k+1;i <n-k;i++) mat[n-k-1][i]=value++;
Step3:找出方陣右半邊列規(guī)律:行下標(biāo)第一列從3變化到0(a44已產(chǎn)生),第二列從2變到1(a43、a33、a03已產(chǎn)生),可推斷行的初值為n-k-2;列下標(biāo)沒變化,兩列的下標(biāo)分別為4、3,故推斷出右半邊的列可由下列循環(huán)結(jié)構(gòu)完成:for(i=n-k-2;i >=k;i--) mat[i][n-k-1]=value++;
Step4:找出方陣上半邊行規(guī)律:已經(jīng)產(chǎn)生了的元素不能再重新賦值,而行下標(biāo)可用層次k來表示,列下標(biāo)與右半邊行下標(biāo)變化規(guī)律一樣,由此推斷出上半邊的行可由下列循環(huán)結(jié)構(gòu)完成:for(i=n-k-2;i >k;i--) mat[k][i]=value++。
當(dāng)k取一個值時,以上四個循環(huán)依序各產(chǎn)生一列或一行元素,由此產(chǎn)生一層元素,當(dāng)k在變化范圍[0…(n+1)/2]內(nèi)依次取值時,四個循環(huán)輪流執(zhí)行,一個數(shù)字螺旋方陣就這樣生成了。
3.2 遞歸算法
分析圖五容易看出,當(dāng)由外及里順時針旋轉(zhuǎn)時,最外層數(shù)據(jù)輸出后,內(nèi)層的圖形只不過是層數(shù)減少了,即問題的規(guī)模變小了,但問題的性質(zhì)沒有發(fā)生變化,新問題和原問題仍然可以采用相同的解法。所以這一問題完全可以采用遞歸的方法來求解。具體的算法描述如下。
Step1:初始化。把需要輸出的數(shù)據(jù)放入一維數(shù)組,設(shè)為b[1..n*n]。因為是n階方陣,所以全部元素共有n2個,輸出b[1]到b[n*n]的順序是方陣順時針旋轉(zhuǎn)的順序。
Step2:把b數(shù)組中的每個元素放入到二維數(shù)組a[i][j](圖5)中去,如b[1]放入a[0][0]中,b[2]放入a[0][1]中,……,b[6]放入a[1][4]中……,其它元素依次放入。
Step3:按行輸出數(shù)組元素a[i][j]即可。
上述算法中,難點在于如何將b數(shù)組放入到a[i][j]數(shù)組對應(yīng)的分量中去。為此,對step2進行求精并使用遞歸來解決。具體做法:將數(shù)組a初始化為0。設(shè)置變量direction作為方向標(biāo)志。當(dāng)direction為1、2、3、4時,分別表示向右、向下、向左、向上。并編寫如下的遞歸子程序walk(x,y,direction,k)。其中參數(shù)x,y表示數(shù)組的下標(biāo)。k是計數(shù)器。當(dāng) k>n*n 為遞歸出口。
case direction of
{right } 1: if到右邊界then 向下拐 else 向右輸出;
{down} 2: if到下邊界 then 向左拐 else 向下輸出;
{left} 3: if到左邊界 then 向上拐 else 向左輸出;
{up} 4: if 到上邊界 then 向右拐 else 向上輸出。
end;{end case}
3.3 算法實現(xiàn)
限于篇幅,本文僅給出遞歸算法的主要程序段(pascal語言)
procedure walk(x,y,direction,k:integer);
begin
if k>n*n then 按行輸出a數(shù)組;
a[x,y]:=b[k];
case direction of
{right}1: if (y=n) or (a[x,y+1]<>0) then walk(x+1,y,2,k+1) else walk(x,y+1,1,k+1);
{down}2: if (x=n) or (a[x+1,y]<>0) then walk(x,y-1,3,k+1) else walk(x+1,y,2,k+1);
{left} 3: if (y=1) or (a[x,y-1]<>0) then walk(x-1,y,4,k+1) else walk(x,y-1,3,k+1);
{up} 4: if (x=1) or (a[x-1,y]<>0) then walk(x,y+1,1,k+1) else walk(x-1,y,4,k+1)
end;
begin{main}
fillchar(a,sizeof(a),0);
writeln('please input a integer for n:');
readln(n);
walk(1,1,1,1);
end.{end main}
4 結(jié)束語
關(guān)于螺旋方陣的輸出算法主要有上述幾種,其他幾種方陣的輸出,可以仿照上述的算法分析加以實現(xiàn)。相對而言,遞 歸算法較為簡潔,但是時間復(fù)雜度要高一些,對于輸出高階螺旋方陣時,時間很長。另外在空間復(fù)雜度方面,采用數(shù)組這種數(shù)據(jù)結(jié)構(gòu),顯然有一定的局限性,如果使 用鏈表來存儲,將會盡可能地避免空間不足的現(xiàn)象。另外,上述問題也可以使用一個模板式的子程序來完成,這時要求輸入的參數(shù)要包括:從外還是從里螺旋、順時 針還是逆時針,起點坐標(biāo)等參數(shù),對于從里向外螺旋時,還要考慮螺旋方陣的階數(shù)是奇數(shù)還是偶數(shù),分別給予不同的處理。
本篇文章來源于 義烏信息技術(shù)教研網(wǎng) 原文鏈接:http://www.ywhs.net/itedu/html/aosaifudao/mingshifudao/20071125/47.html
Java最初是在瀏覽器和客戶端機器中粉墨登場的。當(dāng)時,很多人質(zhì)疑它是否適合做服務(wù)器端的開發(fā)。現(xiàn)在,隨著對Java2平臺企業(yè)版(J2EE)第三方支持的增多,Java被廣泛接納為開發(fā)企業(yè)級服務(wù)器端解決方案的首選平臺之一。
J2EE平臺由一整套服務(wù)(Services)、應(yīng)用程序接口(APIs)和協(xié)議構(gòu)成,它對開發(fā)基于Web的多層應(yīng)用提供了功能支持。
在本文中我將解釋支撐J2EE的13種核心技術(shù):JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML, JMS, Java IDL, JTS, JTA, JavaMail 和 JAF,同時還將描述在何時、何處需要使用這些技術(shù)。當(dāng)然,我還要介紹這些不同的技術(shù)之間是如何交互的。
此外,為了讓您更好地感受J2EE的真實應(yīng)用,我將在WebLogic應(yīng)用服務(wù)器,來自BEA Systems公司的一種廣為應(yīng)用的產(chǎn)品環(huán)境下來介紹這些技術(shù)。不論對于WebLogic應(yīng)用服務(wù)器和J2EE的新手,還是那些想了解J2EE能帶來什么好處的項目管理者和系統(tǒng)分析員,相信本文一定很有參考價值。
宏觀印象: 分布式結(jié)構(gòu)和J2EE
過去,二層化應(yīng)用 -- 通常被稱為client/server應(yīng)用 -- 是大家談?wù)摰淖疃嗟摹T诤芏嗲闆r下,服務(wù)器提供的惟一服務(wù)就是數(shù)據(jù)庫服務(wù)。在這種解決方案中,客戶端程序負責(zé)數(shù)據(jù)訪問、實現(xiàn)業(yè)務(wù)邏輯、用合適的樣式顯示結(jié)果、彈出預(yù)設(shè)的用戶界面、接受用戶輸入等。client/server結(jié)構(gòu)通常在第一次部署的時候比較容易,但難于升級或改進,而且經(jīng)常基于某種專有的協(xié)議,通常是某種數(shù)據(jù)庫協(xié)議。它使得重用業(yè)務(wù)邏輯和界面邏輯非常困難。更重要的是,在Web時代,二層化應(yīng)用通常不能體現(xiàn)出很好的伸縮性,因而很難適應(yīng)Internet的要求。
Sun設(shè)計J2EE的部分起因就是想解決二層化結(jié)構(gòu)的缺陷。于是,J2EE定義了一套標(biāo)準(zhǔn)來簡化N層企業(yè)級應(yīng)用的開發(fā)。它定義了一套標(biāo)準(zhǔn)化的組件,并為這些組件提供了完整的服務(wù)。J2EE還自動為應(yīng)用程序處理了很多實現(xiàn)細節(jié),如安全、多線程等。
用J2EE開發(fā)N層應(yīng)用包括將二層化結(jié)構(gòu)中的不同層面切分成許多層。一個N層化應(yīng)用A能夠為以下的每種服務(wù)提供一個分開的層:
顯示:在一個典型的Web應(yīng)用中,客戶端機器上運行的瀏覽器負責(zé)實現(xiàn)用戶界面。
動態(tài)生成顯示: 盡管瀏覽器可以完成某些動態(tài)內(nèi)容顯示,但為了兼容不同的瀏覽器,這些動態(tài)生成工作應(yīng)該放在Web服務(wù)器端進行,使用JSP、Servlets,或者XML(可擴展標(biāo)記語言)和(可擴展樣式表語言)。
業(yè)務(wù)邏輯:業(yè)務(wù)邏輯適合用Session EJBs(后面將介紹)來實現(xiàn)。
數(shù)據(jù)訪問:數(shù)據(jù)訪問適合用Entity EJBs(后面將介紹)和JDBC來實現(xiàn)。
后臺系統(tǒng)集成: 同后臺系統(tǒng)的集成可能需要用到許多不同的技術(shù),至于何種最佳需要根據(jù)后臺系統(tǒng)的特征而定。
您可能開始詫異:為什么有這么多的層?事實上,多層方式可以使企業(yè)級應(yīng)用具有很強的伸縮性,它允許每層專注于特定的角色。例如,讓W(xué)eb服務(wù)器負責(zé)提供頁面,應(yīng)用服務(wù)器處理應(yīng)用邏輯,而數(shù)據(jù)庫服務(wù)器提供數(shù)據(jù)庫服務(wù)。
由于J2EE建立在Java2平臺標(biāo)準(zhǔn)版(J2SE)的基礎(chǔ)上,所以具備了J2SE的所有優(yōu)點和功能。包括“編寫一次,到處可用”的可移植性、通過JDBC訪問數(shù)據(jù)庫、同原有企業(yè)資源進行交互的CORBA技術(shù),以及一個經(jīng)過驗證的安全模型。在這些基礎(chǔ)上,J2EE又增加了對EJB(企業(yè)級Java組件)、Java servlets、Java服務(wù)器頁面(JSPs)和XML技術(shù)的支持。
分布式結(jié)構(gòu)與WebLogic應(yīng)用服務(wù)器
J2EE提供了一個框架--一套標(biāo)準(zhǔn)API--用于開發(fā)分布式結(jié)構(gòu)的應(yīng)用,這個框架的實際實現(xiàn)留給了第三方廠商。部分廠商只是專注于整個J2EE架構(gòu)中的的特定組件,例如Apache的Tomcat提供了對JSP和servlets的支持,BEA系統(tǒng)公司則通過其WebLogic應(yīng)用服務(wù)器產(chǎn)品為整個J2EE規(guī)范提供了一個較為完整的實現(xiàn)。
WebLogic服務(wù)器已使建立和部署伸縮性較好的分布式應(yīng)用的過程大為簡化。WebLogic和J2EE代你處理了大量常規(guī)的編程任務(wù),包括提供事務(wù)服務(wù)、安全領(lǐng)域、可靠的消息、名字和目錄服務(wù)、數(shù)據(jù)庫訪問和連接池、線程池、負載平衡和容錯處理等。
通過以一種標(biāo)準(zhǔn)、易用的方式提供這些公共服務(wù),象WebLogic服務(wù)器這樣的產(chǎn)品造就了具有更好伸縮性和可維護性的應(yīng)用系統(tǒng),使其為大量的用戶提供了增長的可用性。
J2EE技術(shù)
在接下來的部分里,我們將描述構(gòu)成J2EE的各種技術(shù),并且了解WebLogic服務(wù)器是如何在一個分布式應(yīng)用中對它們進行支持的。最常用的J2EE技術(shù)應(yīng)該是JDBC、JNDI、EJB、JSP和servlets,對這些我們將作更仔細的考察。
Java Database Connectivity (JDBC)
JDBC API以一種統(tǒng)一的方式來對各種各樣的數(shù)據(jù)庫進行存取。和ODBC一樣,JDBC為開發(fā)人員隱藏了不同數(shù)據(jù)庫的不同特性。另外,由于JDBC建立在Java的基礎(chǔ)上,因此還提供了數(shù)據(jù)庫存取的平臺獨立性。
JDBC定義了4種不同的驅(qū)動程序,現(xiàn)分述如下:
類型 1: JDBC-ODBC Bridge
在JDBC出現(xiàn)的初期,JDBC-ODBC橋顯然是非常有實用意義的,通過JDBC-ODBC橋,開發(fā)人員可以使用JDBC來存取ODBC數(shù)據(jù)源。不足的是,他需要在客戶端安裝ODBC驅(qū)動程序,換句話說,必須安裝Microsoft Windows的某個版本。使用這一類型你需要犧牲JDBC的平臺獨立性。另外,ODBC驅(qū)動程序還需要具有客戶端的控制權(quán)限。
類型 2: JDBC-native driver bridge
JDBC本地驅(qū)動程序橋提供了一種JDBC接口,它建立在本地數(shù)據(jù)庫驅(qū)動程序的頂層,而不需要使用ODBC。 JDBC驅(qū)動程序?qū)?shù)據(jù)庫的API從標(biāo)準(zhǔn)的JDBC調(diào)用轉(zhuǎn)換為本地調(diào)用。使用此類型需要犧牲JDBC的平臺獨立性,還要求在客戶端安裝一些本地代碼。
類型 3: JDBC-network bridge
JDBC網(wǎng)絡(luò)橋驅(qū)動程序不再需要客戶端數(shù)據(jù)庫驅(qū)動程序。它使用網(wǎng)絡(luò)上的中間服務(wù)器來存取數(shù)據(jù)庫。這種應(yīng)用使得以下技術(shù)的實現(xiàn)有了可能,這些技術(shù)包括負載均衡、連接緩沖池和數(shù)據(jù)緩存等。由于第3種類型往往只需要相對更少的下載時間,具有平臺獨立性,而且不需要在客戶端安裝并取得控制權(quán),所以很適合于Internet上的應(yīng)用。
類型 4: Pure Java driver
第4種類型通過使用一個純Java數(shù)據(jù)庫驅(qū)動程序來執(zhí)行數(shù)據(jù)庫的直接訪問。此類型實際上在客戶端實現(xiàn)了2層結(jié)構(gòu)。要在N-層結(jié)構(gòu)中應(yīng)用,一個更好的做法是編寫一個EJB,讓它包含存取代碼并提供一個對客戶端具有數(shù)據(jù)庫獨立性的服務(wù)。
WebLogic服務(wù)器為一些通常的數(shù)據(jù)庫提供了JDBC驅(qū)動程序,包括Oracle, Sybase, Microsoft SQL Server以及Informix。它也帶有一種JDBC驅(qū)動程序用于Cloudscape,這是一種純Java的DBMS,WebLogic服務(wù)器中帶有該數(shù)據(jù)庫的評估版本。
以下讓我們看一個實例。
JDBC實例
在這個例子中我們假定你已經(jīng)在Cloudscape中建立了一個PhoneBook數(shù)據(jù)庫,并且包含一個表,名為 CONTACT_TABLE ,它帶有2個字段:NAME 和 PHONE。 開始的時候先裝載Cloudscape JDBC driver,并請求 driver manager得到一個對PhoneBook Cloudscape數(shù)據(jù)庫的連接。通過這一連接,我們可以構(gòu)造一個 Statement 對象并用它來執(zhí)行一個簡單的SQL查詢。最后,用循環(huán)來遍歷結(jié)果集的所有數(shù)據(jù),并用標(biāo)準(zhǔn)輸出將NAME和PHONE字段的內(nèi)容進行輸出。
創(chuàng)建新表:
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根據(jù)已有的表創(chuàng)建新表:
A:create table tab_new like tab_old
B:create table tab_new as select col1,col2… from tab_old definition only