此外,当您正在使用 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 只用于试验原型,或者在没有可供使用的其他驱动程序时才用它。