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