目錄
- 什么是 JDBC 3.0 API?
- JDBC-ODBC Bridge 是否支持 JDBC 3.0 API 中的新特性?
- JDBC-ODBC Bridge 是否可以與 applet 一起使用?
- 我怎樣開始調(diào)試與 JDBC API 有關(guān)的問題?
- 我如何可以使用 JDBC API 通過網(wǎng)絡(luò)訪問像 Microsoft Access 這樣的桌面數(shù)據(jù)庫?
- 有哪些可用的支持 JDBC 技術(shù)的驅(qū)動(dòng)程序?
- 有哪些可用的 JDBC API 文檔?
- 是否有不可與 JDBC-ODBC Bridge 一起工作的 ODBC 驅(qū)動(dòng)程序?
- 什么會(huì)引起“No suitable driver”(沒有合適的驅(qū)動(dòng)程序)錯(cuò)誤?
- 為什么不能找到
java.sql.DriverManager
類? - 我如何一次檢索一整行數(shù)據(jù),而不針對(duì)每一列都調(diào)用一次
ResultSet.getXXX
方法? - 為什么 ODBC 驅(qū)動(dòng)程序管理器會(huì)返回”Data source name not found and no default driver specified Vendor: 0”(數(shù)據(jù)源名稱沒有找到并且沒有默認(rèn)的驅(qū)動(dòng)程序指定供應(yīng)商:0)?
- 是否所有需要的 JDBC 驅(qū)動(dòng)程序都將創(chuàng)建到 JDK 的數(shù)據(jù)庫部分的連接?
- JDBC-ODBC Bridge 是多線程的嗎?
- JDBC-ODBC Bridge 是否在每個(gè)連接中支持多個(gè)并發(fā)的打開語句?
- 當(dāng) next 方法工作時(shí),我為什么不能調(diào)用
ResultSet
方法afterLast
和beforeFirst?
- 我如何可以檢索一個(gè)
String
或其他對(duì)象類型,而不用每次創(chuàng)建一個(gè)新對(duì)象? - 在 JDBC API 中有一個(gè)方法
getColumnCount
。是否有類似的方法來查找結(jié)果集中的行數(shù)? - 我想下載 Java 2 SDK, Standard Edition (以前的 JDK 1.2)的 JDBC-ODBC Bridge。我是 JDBC API 的初學(xué)者,我想從 Bridge 開始。我該怎么做?
- 如果我使用 JDBC API,我有必要使用 ODBC 支配(ODBC underneath)嗎?
- 一旦有了 Sun 的 Java 2 SDK, Standard Edition,連接數(shù)據(jù)庫還需要做其他什么嗎?
![]() |
- 1. 什么是 JDBC 3.0 API?
JDBC 3.0 API 是 JDBC API 的最后更新。它包含了許多特性,包括可滾動(dòng)的結(jié)果集和 SQL:1999 數(shù)據(jù)類型。
- 2. JDBC-ODBC Bridge 是否支持 JDBC 3.0 API 中的新特性?
JDBC-ODBC Bridge 提供了 JDBC 3.0 API 的有限子集。
3. JDBC-ODBC Bridge 是否可以與 applet 一起使用?
運(yùn)行于瀏覽器(比如 Netscape Navigator)中的不受信任的 applet 不允許使用 JDBC-ODBC Bridge。JDBC-ODBC Bridge 不允許不受信任的代碼出于安全方面的考慮而調(diào)用它。這是好的方面,因?yàn)樗砻饔蔀g覽器下載的不受信任 applet 不會(huì)通過調(diào)用 ODBC 來回避 Java 安全。 記住 ODBC 是本機(jī)代碼,所以一旦調(diào)用 ODBC,Java 編程語言就不能保證安全沖突不會(huì)發(fā)生。另一方面,Pure Java JDBC 驅(qū)動(dòng)程序與 applet 一起工作得很好。它們是完全可以下載的,而且不要求任何的客戶端配置。
最后,我想提一下的是,可以將 JDBC-ODBC Bridge 與 applet 一起使用,因?yàn)?applet 瀏覽器假定 applet 是受信任的,因此,applet 會(huì)在 applet 瀏覽器中運(yùn)行。通常關(guān)閉 applet 安全是危險(xiǎn)的,但在某些經(jīng)過控制的場(chǎng)合,比如對(duì)于只在安全 Intranet 環(huán)境中使用的 applet,它可能是合適的。記住如果您選擇這個(gè)選項(xiàng),就會(huì)碰到警告,一有可能避免安全問題,就使用全 Java (all-Java) JDBC 驅(qū)動(dòng)程序。
4. 我怎樣開始調(diào)試與 JDBC API 有關(guān)的問題?
找出 JDBC 調(diào)用正在做什么的一個(gè)好的辦法是啟用 JDBC 跟蹤。JDBC 跟蹤包含活動(dòng)的詳細(xì)列表,這些活動(dòng)發(fā)生在與 JDBC 操作有關(guān)的系統(tǒng)中。
如果您使用
DriverManager
工具包來創(chuàng)建數(shù)據(jù)庫連接,就使用DriverManager.setLogWriter
方法來啟用 JDBC 操作的跟蹤。如果您使用DataSource
對(duì)象來獲取連接,就使用DataSource.setLogWriter
方法來啟用跟蹤。(對(duì)于集中連接,您使用ConnectionPoolDataSource.setLogWriter
方法;對(duì)于參與分布式事務(wù)的連接,使用XADataSource.setLogWriter
方法。)5. 我如何可以使用 JDBC API 通過網(wǎng)絡(luò)訪問像 Microsoft Access 這樣的桌面數(shù)據(jù)庫?
目前多數(shù)桌面數(shù)據(jù)庫要求使用 ODBC 支配的 JDBC 解決方案。這是因?yàn)檫@些數(shù)據(jù)庫產(chǎn)品的供應(yīng)商還沒有實(shí)現(xiàn)全 Java JDBC 驅(qū)動(dòng)程序。
最佳辦法是使用支持想用的 ODBC 和數(shù)據(jù)庫的商業(yè) JDBC 驅(qū)動(dòng)程序。參見 JDBC 驅(qū)動(dòng)程序頁面,獲取可用的 JDBC 驅(qū)動(dòng)程序列表。
來自 Sun Java Software 的 JDBC-ODBC Bridge 沒有單獨(dú)提供對(duì)桌面數(shù)據(jù)庫的訪問。JDBC-ODBC Bridge 將 ODBC 作為本地 DLL 加載,而且針對(duì)桌面數(shù)據(jù)庫(如 Access)的典型 ODBC 驅(qū)動(dòng)器不在網(wǎng)絡(luò)上。不過,JDBC-ODBC Bridge 可以與 RMI-JDBC Bridge 一起使用,以便通過網(wǎng)絡(luò)訪問像 Access 這樣的數(shù)據(jù)庫。 這種 RMI-JDBC-ODBC 解決方案是免費(fèi)的。
6. 有哪些可用的支持 JDBC 技術(shù)的驅(qū)動(dòng)程序?
參閱 有關(guān)支持 JDBC 技術(shù)驅(qū)動(dòng)程序的 Web 頁,獲取當(dāng)前可用的驅(qū)動(dòng)程序列表。
參閱 JDBC 技術(shù)主頁,該頁面中有一些鏈接指向有關(guān) JDBC 技術(shù)的信息。這個(gè)頁面鏈接到有關(guān)特性和優(yōu)點(diǎn)的信息、一系列新特性、有關(guān)入門介紹的一節(jié)、在線教程和有關(guān)驅(qū)動(dòng)程序要求的一節(jié)等信息,它還鏈接到規(guī)范和 javadoc 文檔。
8. 是否有不可與 JDBC-ODBC Bridge 一起工作的 ODBC 驅(qū)動(dòng)程序?
多數(shù) ODBC 2.0 驅(qū)動(dòng)程序應(yīng)當(dāng)與 Bridge 一起工作。由于 ODBC 驅(qū)動(dòng)程序之間在功能上有一些區(qū)別,因此 Bridge 的功能可能會(huì)受到影響。Bridge 與流行的 PC 數(shù)據(jù)庫一起工作,比如 Microsoft Access 和 FoxPro。
9. 什么會(huì)引起“No suitable driver”(沒有合適的驅(qū)動(dòng)程序)錯(cuò)誤?
在調(diào)用
DriverManager.getConnection
方法期間,經(jīng)常會(huì)出現(xiàn)“No suitable driver”的錯(cuò)誤。 原因可能是在調(diào)用getConnection
方法之前,加載合適的 JDBC 驅(qū)動(dòng)程序失敗,或者它可能正在指定一個(gè)非法的 JDBC URL——一個(gè)不被 JDBC 驅(qū)動(dòng)程序識(shí)別的 URL。最好的辦法是檢查 JDBC 驅(qū)動(dòng)程序的文檔或聯(lián)系您的 JDBC 驅(qū)動(dòng)程序供應(yīng)商,前提是您懷疑正在指定不被 JDBC 驅(qū)動(dòng)程序識(shí)別的 URL。此外,當(dāng)您正在使用 JDBC-ODBC Bridge 時(shí),如果不能加載 Bridge 所需的一個(gè)或多個(gè)共享庫,這種錯(cuò)誤就可能發(fā)生。如果您認(rèn)為這是原因所在,就檢查您的配置,以確保 Bridge 能夠訪問共享庫。
- 2. JDBC-ODBC Bridge 是否支持 JDBC 3.0 API 中的新特性?
-
10. 為什么不能找到
java.sql.DriverManager
類?這個(gè)問題可能是由于在支持 JDK 1.0.2 的瀏覽器(如 Netscape Navigator 3.0)中運(yùn)行 JDBC applet 引起的。JDK 1.0.2 不包含 JDBC API,因此在瀏覽器中運(yùn)行的 Java 虛擬機(jī)通常不能找到
DriverManager
類。這里有一個(gè)解決方案,它不要求在 Web 客戶端上做任何附加的配置。記住,出于安全方面的考慮,
java.*
包 中的類不能由多數(shù)瀏覽器下載。因此,許多全 Java 驅(qū)動(dòng)程序供應(yīng)商提供了不同版本的java.sql.*
類,并將它們命名為 jdbc.sql.*,而且也一起提供了使用了這些修改后的類的驅(qū)動(dòng)程序版本。如果在 applet 代碼中導(dǎo)入 jdbc.sql.* 而不是 java.sql.*,并在 applet 的基本代碼 (codebase) 中添加由 JDBC 驅(qū)動(dòng)程序供應(yīng)商提供的 jdbc.sql.* 類,那么 applet 所需的所有 JDBC 類就可以在運(yùn)行時(shí)由瀏覽器下載,包括 DriverManager 類。這個(gè)解決方案將使得 applet 能夠在支持 JDK 1.0.2 的任何客戶端瀏覽器中工作。applet 也可以在支持 JDK 1.1 的瀏覽器中工作,不過出于性能方面的考慮,可能想切換到 JDK 1.1 類。也請(qǐng)記住,這里描繪的解決方案只是一個(gè)例子,其他的解決方案也是可能的。
11. 我如何一次檢索一整行數(shù)據(jù),而不是針對(duì)每一列都調(diào)用一次
ResultSet.getXXX
方法?ResultSet.getXXX 方法是從 ResultSet 對(duì)象中檢索數(shù)據(jù)的惟一方法,這表明必須對(duì)行中的每一列發(fā)出一個(gè)調(diào)用。然而這不大可能是導(dǎo)致性能問題的原因所在,因?yàn)楹茈y看到,在任何場(chǎng)合中,如何提取一列,而不用至少開銷一次函數(shù)調(diào)用。我們歡迎開發(fā)人員提供有關(guān)本主題的信息。
在嘗試使用 Bridge 連接到數(shù)據(jù)庫期間,這種類型的錯(cuò)誤就可能發(fā)生。首先,請(qǐng)注意錯(cuò)誤是來自 ODBC 驅(qū)動(dòng)程序管理器。這表明 Bridge——普通的 ODBC 客戶端——已經(jīng)成功調(diào)用 ODBC,因此問題不是由于本地庫不存在而導(dǎo)致的。在這種情形下,它表明錯(cuò)誤是由于如下事實(shí)而導(dǎo)致的:需要在客戶計(jì)算機(jī)上配置 ODBC DSN(數(shù)據(jù)源名稱)。開發(fā)人員經(jīng)常會(huì)忘記這樣做,認(rèn)為 Bridge 應(yīng)該會(huì)找到遠(yuǎn)程服務(wù)器計(jì)算機(jī)上配置的 DSN。
13. 是否所有需要的 JDBC 驅(qū)動(dòng)程序都將創(chuàng)建到 JDK 的數(shù)據(jù)庫部分的連接?
不是。除了 JDBC-ODBC Bridge 外,沒有任何的支持 JDBC 技術(shù)的驅(qū)動(dòng)程序與 JDK 1.1.x 或 Java 2 Platform 版本捆綁在一起。因此,開發(fā)人員需要獲取驅(qū)動(dòng)程序并安裝它,然后才可以連接到數(shù)據(jù)庫。我們正在考慮在將來捆綁支持 JDBC 技術(shù)的驅(qū)動(dòng)程序。
不是。JDBC-ODBC Bridge 不支持來自不同線程的并發(fā)訪問。JDBC-ODBC Bridge 使用同步方法來序列化它對(duì) ODBC 的所有調(diào)用。多線程 Java 程序可以使用 Bridge,但它們不能得到多線程的優(yōu)點(diǎn)。此外,死鎖可能在數(shù)據(jù)庫持有的鎖和 Bridge 使用的信號(hào) (semaphore) 之間發(fā)生。我們正考慮將來刪除同步方法。原來添加它們的目的是,使得對(duì)于編寫使用單線程 ODBC 驅(qū)動(dòng)程序的 Java 程序的人員來說,事情變得簡(jiǎn)單了。
15. JDBC-ODBC Bridge 是否在每個(gè)連接中支持多個(gè)并發(fā)的打開語句?
不是。當(dāng)使用 JDBC-ODBC Bridge 時(shí),每個(gè)連接只能打開一個(gè)
Statement 對(duì)象。
16. 當(dāng) next 方法工作時(shí),我為什么不能調(diào)用
ResultSet
方法afterLast
和beforeFirst?
您可能正在使用針對(duì) JDBC 1.0 API 實(shí)現(xiàn)的驅(qū)動(dòng)程序。需要升級(jí)到 JDBC 2.0 驅(qū)動(dòng)程序,它實(shí)現(xiàn)了可滾動(dòng)結(jié)果集。同時(shí)保證了代碼已經(jīng)創(chuàng)建可滾動(dòng)結(jié)果集,并且正在使用的 DBMS 支持它們。
17. 我如何可以檢索
String
或其他對(duì)象類型,而不用每次創(chuàng)建一個(gè)新的對(duì)象?不必要地創(chuàng)建潛在的大量對(duì)象(數(shù)百萬),并對(duì)它們進(jìn)行垃圾收集處理,這才可能真正影響到性能。下面這種方法可能會(huì)比較好:使用 JDBC API ,而不是總分配新的對(duì)象來檢索像字符串這樣的數(shù)據(jù)。
我們正在研究這個(gè)主題,確定在某些地方是否應(yīng)該改善 JDBC API。以后可能會(huì)有這方面的信息。此外,如果您有關(guān)于這個(gè)問題的任何評(píng)論,也請(qǐng)發(fā)送給我們。
18. 在 JDBC API 中有一個(gè)方法
getColumnCount
。是否有類似的方法來查找結(jié)果集中的行數(shù)?沒有,但查找行數(shù)是容易的。如果您正在使用可滾動(dòng)結(jié)果集 rs,就可以調(diào)用
rs.last,然后調(diào)用 rs.getRow 來查找 rs 中的行數(shù)。如果結(jié)果集是不可滾動(dòng)的,也可以通過在結(jié)果集中迭代來計(jì)算行數(shù),或者提交一個(gè)查詢,在 SELECT 子句中加上 COUNT 列來取得行數(shù)。
JDBC-ODBC Bridge 與 Java 2 SDK, Standard Edition 捆綁在一起,因此沒有必要另外下載它。
20. 如果我使用 JDBC API,我有必要使用 ODBC 支配(ODBC underneath)嗎?
沒有必要,這只是許多可能的解決方案中的一種。我們推薦使用純支持 Java JDBC 技術(shù)的驅(qū)動(dòng)程序(類型 3 或 4),以便取得 Java 編程語言和 JDBC API 的所有優(yōu)點(diǎn)。
21. 一旦有了 Sun 的 Java 2 SDK, Standard Edition,連接數(shù)據(jù)庫還需要做其他什么嗎?
仍需要獲得并安裝支持 JDBC 技術(shù)的驅(qū)動(dòng)程序,并且它要支持正在使用的數(shù)據(jù)庫。有來自各種資源的許多驅(qū)動(dòng)程序。也可以試著使用 JDBC-ODBC Bridge,前提是已經(jīng)創(chuàng)建了 ODBC 數(shù)據(jù)庫連接。 Bridge 與 Java 2 SDK, Standard Edition 一起提供,它本身不需要任何額外的安裝。Bridge 是普通的 ODBC 客戶端。不過請(qǐng)注意,您應(yīng)該將 JDBC-ODBC Bridge 只用于試驗(yàn)原型,或者在沒有可供使用的其他驅(qū)動(dòng)程序時(shí)才用它。