明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

JDBC技術(shù)說(shuō)明

[摘要]1. 介 紹 Java   許多開(kāi)發(fā)者和用戶都在尋找程Java序中訪問(wèn)數(shù)據(jù)庫(kù)的便捷方法。由于是download 一個(gè)健壯,安全,易于使用的,易于理解且可以從網(wǎng)絡(luò)中自動(dòng),C所以它成為開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用的一種良好的語(yǔ)言基礎(chǔ)。它提供了,C+Smalltalk+,, BASIC, COBOL, and 4GL...

1. 介 紹 Java

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

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

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

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

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

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

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

注 意 JDBC

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

  2.

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

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

級(jí) API Java

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

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

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

遵SQL 循 SQL

  數(shù)據(jù)庫(kù)系統(tǒng)支持各式各樣的語(yǔ)SQL法和語(yǔ)義,它們相互之間在比較高級(jí)的功能例如外部連接,內(nèi)嵌過(guò)程等方面并不一致,盡管我們能夠盼望著隨時(shí)間的推移這些部分的可 以獲得標(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

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

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

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

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

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

 目前對(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è)數(shù)Java據(jù)庫(kù)接口,這個(gè)接口將建立在內(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. API

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

盡 量保持強(qiáng)的、靜態(tài)的類型 JDBC API

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

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

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

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

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

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

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

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

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

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

接 口概貌 JDBC API

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

JDBC API

  被Java描述成為彝族抽象的接SQL口,似的應(yīng)用程序遠(yuǎn)可以對(duì)某個(gè)數(shù)據(jù)庫(kù)打開(kāi)連接,執(zhí)行語(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

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

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

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

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

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

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

java.sql.Driver

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

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

  另外一個(gè)有用的驅(qū)動(dòng)直接接觸數(shù)據(jù)庫(kù)無(wú)關(guān)的網(wǎng)絡(luò)協(xié)議。發(fā)布一個(gè)協(xié)議允許多個(gè)服務(wù)器實(shí)現(xiàn)的方法,例如在或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

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

Java

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

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

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

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

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

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

Java

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

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

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

其 他場(chǎng)合

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

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

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

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

  5.

安 全性考慮 JAVA

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

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

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

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

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

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

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

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

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

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

和Java應(yīng) 用程序 Java

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

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

的 安全責(zé)任 JDBC driver

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

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

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

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

  但是如果一個(gè)驅(qū)TCP動(dòng)試圖在多個(gè)數(shù)據(jù)庫(kù)連接之間共享一個(gè)連applet A接,那么驅(qū)動(dòng)就必須自己負(fù)責(zé)檢查每個(gè)調(diào)用者是否真的被允許與目標(biāo)數(shù)據(jù)庫(kù)聯(lián)系。例如如果我們?yōu)榇騠oobah 開(kāi)了一個(gè)通往機(jī)器的TCP連applet B接,這并不意味著被applet B自動(dòng)允許來(lái)共享這個(gè)連接?蒮oobah能沒(méi)有任何訪問(wèn)機(jī)器的TCP權(quán)力。所以在允許某個(gè)程序重用一個(gè)現(xiàn)成的連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) ;

} Security.checkConnect

  如果連接是不允許的,那么方j(luò)ava.lang.SecurityException法將產(chǎn)生一個(gè)。 5. 3. 2. 檢 查所有的本地文件訪問(wèn) JDBC

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

= System.getSecurityManager( ); if

(security ! null=)

{ security.checkRead

(fileName) ;

} Security.checkRead

  如果對(duì)特定文件的訪問(wèn)是不允許的,那么方j(luò)ava.lang.SecurityException法將產(chǎn)生一個(gè)。 5. 3. 3.

作 好最壞的準(zhǔn)備

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

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

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

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

= System.getSecurityManager( ); if

(security ! null=)

{ security.checkWrite

(foobaz"" ); I.

}


標(biāo)簽:JDBC技術(shù)介紹