国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JDBC技術(shù)介紹

2019-11-18 13:58:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  1. 介紹

  許多開(kāi)發(fā)者和用戶都在尋找java程序中訪問(wèn)數(shù)據(jù)庫(kù)的便捷方法。由于Java是一個(gè)健壯,安全,易于使用的,易于理解且可以從網(wǎng)絡(luò)中自動(dòng)download ,所以它成為開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用的一種良好的語(yǔ)言基礎(chǔ)。它提供了C,C++,Smalltalk, BASIC, COBOL, and 4GLs的許多優(yōu)點(diǎn)。許多公司已經(jīng)開(kāi)始在Java與DBMS的連接方面做工作。

  許多Java應(yīng)用開(kāi)發(fā)者都希望能夠編寫(xiě)?yīng)毩⒂谔囟―BMS的程序,而我們也相信一個(gè)獨(dú)立于DBMS的接口將使得與各種各樣DBMS連接變得最為便捷,開(kāi)發(fā)更加迅速。所以我們認(rèn)為定義一個(gè)通用的SQL數(shù)據(jù)庫(kù)存取框架,在各種各樣的提供數(shù)據(jù)庫(kù)連接模塊上提供統(tǒng)一的界面是十分有意義的。這使程序員可以面對(duì)單一的數(shù)據(jù)庫(kù)界面,使數(shù)據(jù)庫(kù)無(wú)關(guān)的Java工具和產(chǎn)品成為可能,使得數(shù)據(jù)庫(kù)連接的開(kāi)發(fā)者可以提供各種各樣的連接方案。我們看到我們定義一個(gè)通用低層的,支持基本SQL功能的JavaDataBase Connectivity (JDBC)API的緊迫任務(wù)。

  幸運(yùn)的是我們不必從頭設(shè)計(jì)一個(gè)SQL API。我們可以把我們的工作建立在 X/Open SQL CLI (調(diào)用層接口)之上(它也是Microsoft´s ODBC 的基礎(chǔ))。

  我們主要任務(wù)是定義一個(gè)自然的Java接口來(lái)與X/Open CLI中定義的基本的抽象層和概念連接。

  JDBC API得到數(shù)據(jù)庫(kù)開(kāi)發(fā)廠商,連接開(kāi)發(fā)廠商,ISV,以及應(yīng)用開(kāi)發(fā)者的支持是十分重要的。我們相信把我們的工作建立在ODBC抽象層的基礎(chǔ)上將JDBC更加輕易得到大家的接受。而且從技術(shù)上來(lái)說(shuō),ODBC是我們?cè)O(shè)計(jì)工作的一個(gè)良好基礎(chǔ)。

  因?yàn)镺DBC是一個(gè)C語(yǔ)言接口,所以O(shè)DBC在Java中直接使用不適當(dāng)。從Java中來(lái)調(diào)用C代碼在安全性,健壯性,實(shí)現(xiàn)的方便,可移植性等等方面有許多不便。它使得Java在這些方面的許多優(yōu)點(diǎn)得不到發(fā)揮。

  我們已經(jīng)在短期里面實(shí)現(xiàn)了一個(gè)建立在ODBC上的API。長(zhǎng)遠(yuǎn)來(lái)看,我們可以通過(guò)其他方式提供實(shí)現(xiàn)。

1. 1. 注重

  我們非常感謝在數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)連接和數(shù)據(jù)庫(kù)工具領(lǐng)域的許多早期的工作者。他們?yōu)镴DBC的早期草案提供了很好的意見(jiàn)和建議。他們的工作對(duì)本規(guī)范起了不可估量的作用。

 

2. 目標(biāo)與哲學(xué)

  這個(gè)部分描述了指引這個(gè)API開(kāi)發(fā)的目標(biāo)以及哲學(xué)。

2. 1. SQL 級(jí) API

  我們的主要目標(biāo)是為Java定義一個(gè)“調(diào)用級(jí)”(call-level)的SQL接口。著意味著我們主要的注重力集中在執(zhí)行原原本本的SQL語(yǔ)句并且取回結(jié)果。我們預(yù)計(jì)高層的API也將被定義,這些可能將建立在基層的接口上。

  這些高層接口包括象直接地、透明地把表里面的數(shù)據(jù)影射到Java類里面,用語(yǔ)法樹(shù)表示更加通用的查詢,以及Java內(nèi)嵌的SQL語(yǔ)法。

  我們希望大量的應(yīng)用開(kāi)發(fā)工具將使用我們的API。然而我們也希望程序員能夠使用我們的API,尤其是目前這樣在Java里沒(méi)有任何其他手段(應(yīng)該是說(shuō)數(shù)據(jù)庫(kù)訪問(wèn)手段)的情況下。

2. 2. 遵循SQL

  數(shù)據(jù)庫(kù)系統(tǒng)支持各式各樣的SQL語(yǔ)法和語(yǔ)義,它們相互之間在比較高級(jí)的功能例如外部連接,內(nèi)嵌過(guò)程等方面并不一致,盡管我們能夠盼望著隨時(shí)間的推移這些部分的SQL可以獲得標(biāo)準(zhǔn)化。同時(shí)我們采取這樣的態(tài)度與立場(chǎng):

  In fact, an application query need not even be SQL, or it may be a specialized derivative of SQL, e.g. for document or image queries, designed for specific DBMSs.

  In order to pass JDBC compliance tests and to be called "JDBC COMPLIANT " we require that a driver support at least ANSI SQL-2 Entry Level. This gives applications that want wide portability a guaranteed least common denominator. We believe ANSI SQL-2 Entry Level is reasonably powerful and is reasonably widely supported today.

* JDBC答應(yīng)查詢表達(dá)式直接傳遞到底層的數(shù)據(jù)驅(qū)動(dòng),這樣一個(gè)程序可以獲得盡量多的SQL功能,但是可能被DBMS拒絕。事實(shí)上,一個(gè)程序的查詢甚至可以不是SQL的,或者是SQL的一個(gè)非凡演化,例如:為專門(mén)數(shù)據(jù)庫(kù)設(shè)計(jì)的文本或者圖形查詢。

* 為了通過(guò)JDBC兼容的測(cè)試,并且能夠被稱為JDBC兼容,我們要求一個(gè)驅(qū)動(dòng)至少支持ANSI SQL-2的標(biāo)準(zhǔn)。這使得那些需要廣泛移植性的程序獲得一個(gè)最小的分母(這句話的原文是:This gives applications that want wide portability a guaranteed least common denominator.)。我們相信ANSI SQL-2是足夠強(qiáng)大的,并且是得到足夠支持的。

2. 3. JDBC必須可以建立在現(xiàn)有的數(shù)據(jù)庫(kù)接口上

  我們必須能夠保證 JDBC SQL API 能夠建立在普通的SQL API上,尤其是ODBC。這些要求已經(jīng)對(duì)這個(gè)規(guī)范的一些部分產(chǎn)生了影響,尤其是對(duì)傳出參數(shù)(OUT parameter)和大數(shù)據(jù)塊的處理。

2. 4. 必須保證這個(gè)接口與JAVA系統(tǒng)的其他部分保持一致

 目前對(duì)JAVA的積極回應(yīng)已經(jīng)十分熱烈。很大程度上是由于這個(gè)語(yǔ)言標(biāo)準(zhǔn)以及標(biāo)準(zhǔn)運(yùn)行時(shí)庫(kù)被認(rèn)為是一致,簡(jiǎn)單和強(qiáng)大的。我們將盡我們所能,提供這個(gè)Java數(shù)據(jù)庫(kù)接口,這個(gè)接口將建立在Java內(nèi)核現(xiàn)有的這種風(fēng)格,并且將進(jìn)一步加強(qiáng)它。

2. 5. 保持簡(jiǎn)單

  We would PRefer to keep this base API as simple as possible, at least initially. In general we would prefer to provide a single mechanism for performing a particular task, and avoid provid-ing duplicate mechanisms. We will extend the API later if any important functionality is miss-ing.

  我們將力爭(zhēng)使得基本的API盡量簡(jiǎn)單,至少開(kāi)始的時(shí)候是這樣的。一般來(lái)說(shuō),我們希望對(duì)實(shí)現(xiàn)每個(gè)特定的任務(wù)只提供一種方案,而避免提供多種方案。假如一些重要的功能遺漏了,那么我們?cè)谕硇r(shí)候?qū)U(kuò)充這個(gè)API。

2. 6. 盡量保持強(qiáng)的、靜態(tài)的類型

  我們希望這個(gè)JDBC API保持盡量強(qiáng)的類型檢查,使得盡可能多的類型信息可以靜態(tài)地表達(dá)。著使得盡可能多的錯(cuò)誤可以在編譯的時(shí)候被發(fā)現(xiàn)。

  由于SQL本身是動(dòng)態(tài)類型的,所以我們可能會(huì)在程序運(yùn)行的時(shí)候碰到類型不能匹配的問(wèn)題。例如:當(dāng)一個(gè)程序員在希望SELECT返回一個(gè)整數(shù),但是實(shí)際返回的是一個(gè)字符串“foo”. 但是我們依然希望程序員把他們所希望的類型在編譯的時(shí)候就能夠表達(dá)清楚,這樣我們可以做盡可能多的靜態(tài)檢查。我們也希望在必要的時(shí)候能夠支持動(dòng)態(tài)類型接口(見(jiàn)第四章)

2. 7. 使普通任務(wù)簡(jiǎn)化

  我們希望普通的任務(wù)能夠是簡(jiǎn)單的,而不一般的工作是可行的。

  一個(gè)普通任務(wù)是指一個(gè)程序員執(zhí)行一個(gè)簡(jiǎn)單的沒(méi)有參數(shù)的SQL語(yǔ)句(例如:SELECT,INSERT,UPDATE,DELETE),然后(例如SELECT)處理返回的具有簡(jiǎn)單類型的元組。一個(gè)具有傳入?yún)?shù)(IN parameter)的SQL語(yǔ)句也是普通的。

  不那么普通但是也是十分重要的情形是當(dāng)程序員使用有INOUT,OUT參數(shù)的SQL語(yǔ)句。我們也需要支持讀寫(xiě)幾兆字節(jié)對(duì)象的SQL語(yǔ)句,更非凡一些的情形包括一個(gè)語(yǔ)句返回了多個(gè)結(jié)果集合。

  我們希望元數(shù)據(jù)(Meatdata)的使用很少的,只是那些熟練的程序員以及開(kāi)發(fā)工具才需要處理的問(wèn)題。元數(shù)據(jù)存取函數(shù)以及動(dòng)態(tài)類型數(shù)據(jù)存取函數(shù)在這個(gè)文檔末尾,一般的程序員可以不必關(guān)心這些章節(jié)。

2. 8. 不同的功能讓不同的方法(函數(shù))來(lái)實(shí)現(xiàn)(“方法”的原文是:method,這樣翻譯是跟VB的)

  一種界面設(shè)計(jì)風(fēng)格是使用很少的過(guò)程,提供許多作為參數(shù)傳遞的控制標(biāo)志,這樣它們可以用來(lái)影響很大一個(gè)范圍內(nèi)的各種行為。來(lái)表達(dá)不同的功能。這趨向與使用很多的方法,但是每個(gè)方法都比較同意理解。

  一般來(lái)說(shuō),Java內(nèi)核類使用不同的方法(method)。這個(gè)步驟的主要優(yōu)點(diǎn)是開(kāi)始學(xué)習(xí)基本界面的程序員可以不必被那些與復(fù)雜功能相關(guān)的參數(shù)所困擾。我們力圖在JDBC接口上也采用相同的策略。一般來(lái)說(shuō)采用不同的方法而不是采用不同的標(biāo)志和多用途的方法。

3. 接口概貌

  接口分為兩個(gè)層次,一個(gè)是面向程序開(kāi)發(fā)人員的JDBC API。另外一個(gè)是底層的JDBC Driver API。

3. 1. JDBC API

  JDBC API 被描述成為彝族抽象的Java接口,似的應(yīng)用程序遠(yuǎn)可以對(duì)某個(gè)數(shù)據(jù)庫(kù)打開(kāi)連接,執(zhí)行SQL語(yǔ)句并且處理結(jié)果。最重要的接口是:

* java.sql.DriverManager 處理驅(qū)動(dòng)的調(diào)入并且對(duì)產(chǎn)生新的數(shù)據(jù)庫(kù)連接提供支持。

* java.sql.Connection 代表對(duì)特定數(shù)據(jù)庫(kù)的連接。

* java.sql.Statement  代表一個(gè)特定的容器,來(lái)對(duì)一個(gè)特定的數(shù)據(jù)庫(kù)執(zhí)行SQL語(yǔ)句。

* java.sql.ResultSet  控制對(duì)一個(gè)特定語(yǔ)句的行數(shù)據(jù)的存取。

其中java.sql.Statement又有兩個(gè)子類型:

1. java.sql.PreparedStatement  用于執(zhí)行預(yù)編譯的SQL語(yǔ)句。

2. java.sql.CallableStatement  用于執(zhí)行對(duì)一個(gè)數(shù)據(jù)庫(kù)內(nèi)嵌過(guò)程的調(diào)用。

  下面的章節(jié)對(duì)JDBC是如何運(yùn)行的提供了更多描述,整個(gè)定義見(jiàn)第13章。另外第15章描述了系統(tǒng)假如獲取數(shù)據(jù)庫(kù)的元數(shù)據(jù)信息。

3. 2. JDBC Driver API

  java.sql.Driver在第9章有完整的定義了.大部分JDBC驅(qū)動(dòng)只需要完成這些JDBC API所定義的抽象類就可以了。非凡地,所有的driver必須提供對(duì)java.sql.Connection, java.sql. State-ment, java.sql.Prepared-Statement, and java.sql.ResultSet的實(shí)現(xiàn)。假如目標(biāo)DBMS提供有OUT參數(shù)的內(nèi)嵌過(guò)程,那么還必須提供java.sql.CallableStatement 接口。 每個(gè)database driver必須提供一個(gè)類:java.sql.Driver以使得系統(tǒng)可以由 java.sql.DriverManager來(lái)治理。

  一個(gè)顯然的driver是在ODBC之上提供對(duì)JDBC的實(shí)現(xiàn),從而提供與ODBC接口的JDBC-ODBC 橋,就象前面的圖所顯示的.由于JDBC放在ODBC之后,所以實(shí)現(xiàn)起來(lái)簡(jiǎn)單而且高效。

  另外一個(gè)有用的驅(qū)動(dòng)直接接觸數(shù)據(jù)庫(kù)無(wú)關(guān)的網(wǎng)絡(luò)協(xié)議。發(fā)布一個(gè)協(xié)議答應(yīng)多個(gè)服務(wù)器實(shí)現(xiàn)的方法,例如在ODBC或者特定的DBMS上(盡管已經(jīng)有了一些使用固定協(xié)議的產(chǎn)品,但是我們不打算對(duì)它們實(shí)現(xiàn)標(biāo)準(zhǔn)化。),是可取的。

 

4. JDBC使用場(chǎng)合

  Before looking at specifics of the JDBC API, an understanding of typical use scenarios is help-ful. There are two common scenarios that must be treated differently for our purposes: applets and applications.

  在看JDBC API之前了解一下典型的使用場(chǎng)合是有幫助的。通常有兩種情形必須分別對(duì)待:applet和application.

4. 1. Applet

  目前Java使用的最多的從網(wǎng)絡(luò)中下載的applet,它們作為web文件的一個(gè)部分。當(dāng)中有數(shù)據(jù)庫(kù)存取applet和能夠使用JDBC來(lái)接觸數(shù)據(jù)庫(kù)的applet。例如,一個(gè)用戶可能下載一個(gè)顯示股票歷史價(jià)格圖的applet。這個(gè)applet通過(guò)internet來(lái)從關(guān)系數(shù)據(jù)庫(kù)中獲得股票歷史價(jià)格。

  最一般的情況里面,對(duì)applet的使用是通過(guò)不可靠的邊界的。例如從另外一個(gè)公司或者Internet上獲得這些applet。于是稱這個(gè)情況為"Internet"場(chǎng)合。然而applet也可能通過(guò)局域網(wǎng)下載。在這個(gè)情況里面,客戶機(jī)的安全都還是一個(gè)問(wèn)題。

典型的applet在幾個(gè)方面與傳統(tǒng)的數(shù)據(jù)庫(kù)應(yīng)用程序有所不同:

1). 不可靠的applet被嚴(yán)格地限制在他們被答應(yīng)執(zhí)行的的操作上。非凡地,不答應(yīng)他們存取本地的文件,切不答應(yīng)他們對(duì)任意的數(shù)據(jù)庫(kù)建立網(wǎng)絡(luò)連接。

2). 就標(biāo)識(shí)和連接網(wǎng)上數(shù)據(jù)庫(kù)來(lái)說(shuō),Internet環(huán)境里面的applet面臨新的問(wèn)題。

3). 當(dāng)數(shù)據(jù)庫(kù)可能與你相隔萬(wàn)里的時(shí)候,效率的考慮也有所不同了。與局域網(wǎng)相比,Internet上數(shù)據(jù)庫(kù)applet可能會(huì)碰到十分不同的反應(yīng)時(shí)間。

4. 2. Application

  Java也可以用來(lái)建立普通的應(yīng)用,從而想一般的應(yīng)用一樣在客戶機(jī)上使用。我們相信隨著開(kāi)發(fā)工具越來(lái)越多,人們開(kāi)始熟悉到提高程序生產(chǎn)效率的必要性,以及Java的其他優(yōu)點(diǎn),Java的這種用法將越來(lái)越流行。在這種方式里面,Java的代碼是可以信賴的,且被答應(yīng)讀寫(xiě)文件打開(kāi)網(wǎng)絡(luò)連接等等,就想其他的應(yīng)用程序代碼一樣。

  也許這些Java應(yīng)用使用的最多的是在一個(gè)公司內(nèi)部或者在Intranet上,所以不妨成為Intranet場(chǎng)合。例如一個(gè)公司希望利用Java及其GUI構(gòu)件工具來(lái)建立他的基于合作數(shù)據(jù)模式的合作軟件。這些應(yīng)用程序?qū)⒋嫒【钟蚓W(wǎng)或者廣域網(wǎng)的數(shù)據(jù)。Java應(yīng)用可以作到這些。

  Java應(yīng)用程序場(chǎng)合和Intranet場(chǎng)合與applet場(chǎng)合有諸多不同。例如標(biāo)定一個(gè)數(shù)據(jù)庫(kù)最自然的方式是用一個(gè)數(shù)據(jù)庫(kù)的名字,就象"Customers" 和"Personnel"這樣。然后用戶希望系統(tǒng)能夠定位具體的機(jī)器,DBMS,JDBC driver,和Java應(yīng)用程序。

4. 3. 其他場(chǎng)合

還有其他一些有趣的場(chǎng)合:

1). 已驗(yàn)證的applet(Trusted applets)是指那些已經(jīng)被Java虛擬機(jī)器認(rèn)定是可以信賴的applet。他們之所以被認(rèn)為是可信的是因?yàn)樗麄円呀?jīng)對(duì)上了特定的密匙,或者用戶認(rèn)為從特定來(lái)源來(lái)的applet是可信的。在安全的方面上他們與應(yīng)用(appliction)相同,但是其他方面(例如定位一個(gè)數(shù)據(jù)庫(kù))與則與applet相似。

2). 與直接從Java GUI出發(fā)用客戶/服務(wù)器模式來(lái)度曲DBMS服務(wù)器不同,三層存取方式可能被使用。在這個(gè)場(chǎng)合里面,Java應(yīng)用程序?qū)χ虚g層的服務(wù)發(fā)出調(diào)用,中間層的服務(wù)在網(wǎng)上,它又再去調(diào)用數(shù)據(jù)庫(kù)。這些調(diào)用可能通過(guò)RPC (remote procedure call)或者ORB (object request broker )。在這兩種場(chǎng)合里面,中間層最好使用一個(gè)對(duì)象變化。我們希望三層結(jié)構(gòu)會(huì)變得越來(lái)越普遍,因?yàn)閷?duì)于MIS治理者來(lái)說(shuō),這可以使得他們有機(jī)會(huì)在公共數(shù)據(jù)庫(kù)上顯式地定義合法操作等。同時(shí)三層結(jié)構(gòu)可以提供許多效率上的好處。

  目前中間層一般用C或者C++這樣的語(yǔ)言來(lái)完成。通過(guò)優(yōu)化編譯器把把Java 字節(jié)代碼翻譯成為高效的機(jī)器代碼,中間層也可以用Java來(lái)實(shí)現(xiàn)。Java有許多優(yōu)良特性(健壯性,安全性,多線程)可以達(dá)到中間層需要達(dá)到的目的。

 

5. 安全性考慮

  作為網(wǎng)絡(luò)上的語(yǔ)言JAVA必須十分注安全性的考慮?;谏厦娴挠懻?,JDBC的兩種主要使用場(chǎng)合里面,我們必須考慮安全性問(wèn)題:

* 在Java applications的場(chǎng)合里面Java代碼是本地的,所以也是"trusted"

* 沒(méi)有驗(yàn)證的Java applet代碼不可以存取本地的以及其他網(wǎng)絡(luò)的數(shù)據(jù)。

5. 1. JDBC 和未驗(yàn)證的applet

JDBC首先必須符合JAVA的一般安全規(guī)則。另外:

* JDBC 必須認(rèn)為沒(méi)有驗(yàn)證的applets是不可靠的。

* JDBC 不可以讓不可靠的applets存取本地?cái)?shù)據(jù)庫(kù)。

* 一個(gè)已經(jīng)向JDBC DriverManager注冊(cè)的是JDBC Driver只能存取它所來(lái)的數(shù)據(jù)源。

* 一個(gè)applet也只能向它所Download來(lái)的服務(wù)器來(lái)存取數(shù)據(jù)。

  假如JDBC驅(qū)動(dòng)層假如完全確信對(duì)一個(gè)數(shù)據(jù)庫(kù)服務(wù)器打開(kāi)連接不會(huì)引起認(rèn)證或者權(quán)限問(wèn)題(可能由網(wǎng)上隨機(jī)主機(jī)上運(yùn)行的程序引起),那么它就答應(yīng)applet打開(kāi)這樣的連接。數(shù)據(jù)庫(kù)服務(wù)器不通過(guò)ip地址來(lái)限制存取是相當(dāng)少的,主要是為了舉例。(當(dāng)心,這一段話我可能翻譯反了!!!大家看看原文。)這些限制是相當(dāng)煩瑣的。不過(guò)他們與對(duì)一般applet的限制是一致的我們沒(méi)有必要放開(kāi)這些限制。

5. 2. JDBC 和Java應(yīng)用程序

  對(duì)于一個(gè)普通的Java應(yīng)用程序(例如全部用Java代碼而不是不可靠的applet )JDBC將從本地的類路徑里面獲得驅(qū)動(dòng),并且答應(yīng)應(yīng)用程序自由存取文件,遠(yuǎn)程服務(wù)器等等。

  但是和applet一樣,假如由于某些原因一個(gè)沒(méi)有驗(yàn)證的sun.sql.Driver類從遠(yuǎn)程的來(lái)源里面獲得,那么這個(gè)驅(qū)動(dòng)只能和相同地方來(lái)的代碼配合。

5. 3. Driver的安全責(zé)任

  JDBC driver可能在各種情況下使用,所以驅(qū)動(dòng)的編制者遵循一定的簡(jiǎn)單的安全規(guī)則,從而避免applet做非法的數(shù)據(jù)庫(kù)連接。

  假如所有的驅(qū)動(dòng)都象applet一樣從網(wǎng)上下載,那么這些原則將是不必要的,因?yàn)槠胀ǖ陌踩?guī)則已經(jīng)對(duì)它做了限制。但是驅(qū)動(dòng)的編寫(xiě)者必須記住一旦他們的驅(qū)動(dòng)獲得成功,用戶將在本地磁盤(pán)安裝這些驅(qū)動(dòng),那么驅(qū)動(dòng)將成為Java環(huán)境中一個(gè)被信任的部分,所以必須確信它不會(huì)被來(lái)訪的applet所濫用。所以我們鼓勵(lì)所有的驅(qū)動(dòng)編寫(xiě)者必須遵循一定安全原則。

  所有這些原則都是在連接打開(kāi)的時(shí)候使用。這正式驅(qū)動(dòng)和虛擬機(jī)器檢查當(dāng)前調(diào)用者是否真的可以與指定的數(shù)據(jù)庫(kù)連接的時(shí)刻。一旦連接建立就不必做更多的檢查了。

5. 3. 1. 分享TCP/IP連接的時(shí)候必須謹(jǐn)慎   假如一個(gè)JDBC驅(qū)動(dòng)試圖打開(kāi)一個(gè) TCP 連接,那么這個(gè)打開(kāi)會(huì)被Java 安全治理機(jī)制自動(dòng)檢查。這個(gè)機(jī)構(gòu)會(huì)檢查當(dāng)前調(diào)用棧里面有沒(méi)有applet,假如有那么就限定它可以訪問(wèn)的機(jī)器集合。所以一般地JDBC驅(qū)動(dòng)可以把TCP建立檢查留給Java虛擬機(jī)。

  但是假如一個(gè)JDBC驅(qū)動(dòng)試圖在多個(gè)數(shù)據(jù)庫(kù)連接之間共享一個(gè)TCP連接,那么驅(qū)動(dòng)就必須自己負(fù)責(zé)檢查每個(gè)調(diào)用者是否真的被答應(yīng)與目標(biāo)數(shù)據(jù)庫(kù)聯(lián)系。例如假如我們?yōu)閍pplet A打開(kāi)了一個(gè)通往機(jī)器foobah 的TCP連接,這并不意味著applet B被自動(dòng)答應(yīng)來(lái)共享這個(gè)連接。applet B可能沒(méi)有任何訪問(wèn)機(jī)器foobah的權(quán)力。所以在答應(yīng)某個(gè)程序重用一個(gè)現(xiàn)成的TCP連接之前,JDBC 驅(qū)動(dòng)必須通過(guò)安全機(jī)構(gòu)來(lái)檢查當(dāng)前的的調(diào)用者是否可以訪問(wèn)這個(gè)連接。通過(guò)下面的代碼可是實(shí)現(xiàn)這個(gè)功能。

SecurityManager security = System.getSecurityManager();

if (security != null)

{

security.checkConnect(hostName, portNumber);

}

  假如連接是不答應(yīng)的,那么Security.checkConnect方法將產(chǎn)生一個(gè)java.lang.SecurityException。 5. 3. 2. 檢查所有的本地文件訪問(wèn)

  假如一個(gè)JDBC取得需要訪問(wèn)本地機(jī)器上的數(shù)據(jù),那么他必須確信調(diào)用者是被答應(yīng)打開(kāi)這個(gè)文件的。例如:

SecurityManager security = System.getSecurityManager();

if (security != null)

{

security.checkRead(fileName);

}

  假如對(duì)特定文件的訪問(wèn)是不答應(yīng)的,那么Security.checkRead方法將產(chǎn)生一個(gè)java.lang.SecurityException。

5. 3. 3. 作好最壞的預(yù)備

  一些驅(qū)動(dòng)可能使用本地的方法來(lái)橋接底層數(shù)據(jù)庫(kù)程序。則這些情況里面判定那些本地文件將被底層函數(shù)所訪問(wèn)是困難的。

  在這些環(huán)境里面用戶必須作好最壞的打算,并且否決所有下載applet所發(fā)出的數(shù)據(jù)庫(kù)存取,除非驅(qū)動(dòng)可能完全確信將要做存取是沒(méi)有問(wèn)題的。

  例如一個(gè)JDBC-ODBC橋接器必須檢查ODBC數(shù)據(jù)源的的名稱,確保applet只可以訪問(wèn)它的"生源地"。假如對(duì)有的名字中不能判定出數(shù)據(jù)源的主機(jī)名,那么只能否決這個(gè)訪問(wèn)。

  為了決定一個(gè)當(dāng)前的調(diào)用者是可以信賴的應(yīng)用還是一個(gè)applet,JDBC驅(qū)動(dòng)必須能夠檢查這個(gè)調(diào)用者是否可以寫(xiě)一個(gè)隨機(jī)的文件:

SecurityManager security = System.getSecurityManager();

if (security != null)

{

security.checkWrite("foobaz");

}

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 祁阳县| 额敏县| 克山县| 玉门市| 山东| 安陆市| 大名县| 扶沟县| 德钦县| 绥中县| 修水县| 新泰市| 新丰县| 新邵县| 简阳市| 兴义市| 卢氏县| 丹棱县| 芮城县| 泽普县| 蒲城县| 营山县| 凤城市| 施秉县| 馆陶县| 工布江达县| 论坛| 大宁县| 井研县| 丹江口市| 虹口区| 沭阳县| 沛县| 包头市| 诸城市| 福州市| 临沧市| 吉林省| 海南省| 伊川县| 通辽市|