JDBC常见问题
目录
JDBC-ODBC Bridge 是否支持 JDBC 3.0 API 中的新特性?
JDBC-ODBC Bridge 是否可以与 applet 一起使用?
我如何可以使用 JDBC API 通过网络访问像 Microsoft Access 这样的桌面数据库?
是否有不可与 JDBC-ODBC Bridge 一起工作的 ODBC 驱动程序?
什么会引起“No suitable driver”(没有合适的驱动程序)错误?
为什么不能找到 java.sql.DriverManager 类?
我如何一次检索一整行数据,而不针对每一列都调用一次 ResultSet.getXXX 方法?
是否所有需要的 JDBC 驱动程序都将创建到 JDK 的数据库部分的连接?
JDBC-ODBC Bridge 是否在每个连接中支持多个并发的打开语句?
当 next 方法工作时,我为什么不能调用 ResultSet 方法 afterLast 和 beforeFirst?
我如何可以检索一个 String 或其他对象类型,而不用每次创建一个新对象?
在 JDBC API 中有一个方法 getColumnCount。是否有类似的方法来查找结果集中的行数?
如果我使用 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 驱动程序。
4. 我怎样开始调试与 JDBC API 有关的问题?
找出 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 解决方案是免费的。
6. 有哪些可用的支持 JDBC 技术的驱动程序?
参阅 有关支持 JDBC 技术驱动程序的 Web 页,获取当前可用的驱动程序列表。
7. 有哪些可用的 JDBC API 文档?
参阅 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 能够访问共享库。
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 对象中检索数据的惟一方法,这表明必须对行中的每一列发出一个调用。然而这不大可能是导致性能问题的原因所在,因为很难看到,在任何场合中,如何提取一列,而不用至少开销一次函数调用。我们欢迎开发人员提供有关本主题的信息。
12. 为什么 ODBC 驱动程序管理器会返回“Data source name not found and no default driver specified Vendor: 0”(数据源名称没有找到并且没有默认的驱动程序指定供应商:0)?
在尝试使用
Bridge 连接到数据库期间,这种类型的错误就可能发生。首先,请注意错误是来自 ODBC 驱动程序管理器。这表明
Bridge——普通的 ODBC 客户端——已经成功调用 ODBC,因此问题不是由于本地库不存在而导致的。在这种情形下,它表明错误是由于如下事实而导致的:需要在客户计算机上配置 ODBC DSN(数据源名称)。开发人员经常会忘记这样做,认为
Bridge 应该会找到远程服务器计算机上配置的 DSN。
13. 是否所有需要的 JDBC 驱动程序都将创建到 JDK 的数据库部分的连接?
不是。除了 JDBC-ODBC Bridge 外,没有任何的支持 JDBC 技术的驱动程序与 JDK 1.1.x 或 Java 2 Platform 版本捆绑在一起。因此,开发人员需要获取驱动程序并安装它,然后才可以连接到数据库。我们正在考虑在将来捆绑支持 JDBC 技术的驱动程序。
14. JDBC-ODBC Bridge 是多线程的吗?
不是。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 只用于试验原型,或者在没有可供使用的其他驱动程序时才用它。