3

[1] 在 JDBC 中,为什么要首先使用 Class.forName("some driver name") 加载驱动程序。为什么 SUN 不负责在 getConnection() 方法本身中加载驱动程序。如果我将驱动程序名称作为参数传递给 getConnection() 方法。

[2] 我想了解 JBDC 内部。任何指向它的指针都值得赞赏。

4

3 回答 3

8

使用 JDBC 4,您不再需要使用 Class.forName(...) 请参阅此处的一篇文章来解释这一点:

连接到数据库需要在客户端的 VM 中加载合适的 JDBC 数据库驱动程序。在 JDBC 的早期,通常通过 Class.forName() 加载合适的驱动程序,传入实现 JDBC Driver 接口的类的名称。DriverManager 类后来提供了一种更灵活的方法来管理客户端应用程序中的 JDBC 驱动程序。为了使驱动程序可用,必须使用驱动程序的类名调用 DriverManager 的 registerDriver()。或者,您可以通过 jdbc.drivers 系统属性指定要加载的驱动程序。当 DriverManager 初始化时,它会尝试加载与该属性关联的驱动程序。

JDBC 4 添加了J2SE 服务提供者机制作为另一种指定数据库驱动程序的方法。为此,驱动程序 JAR 文件必须包含文件 META-INF/services/java.sql.driver。该文件必须包含一行,其中包含 JDBC 驱动程序的 Driver 接口实现的名称。如果需要,在 DriverManager 上调用 getConnection() 将加载如此打包的驱动程序。加载驱动程序时,会创建驱动程序的一个实例,然后调用 registerDriver() 以使该驱动程序可供客户端使用。

有关 JDBC 的更多信息,请查看Sun 的 JDBC 链接。与其他一些规范相比,JDBC 4.0 规范读起来比较好……

于 2008-11-06T15:44:41.610 回答
1

如果只给 java.sql 提供 JDBC 协议名称,它就无法知道要加载哪个类。可以说 JDBC 驱动程序 jar 文件应该能够在其清单中或 META-INF/ 下的其他位置指定协议名称和驱动程序类。在我看来,您最好自己构建驱动程序实例,而不是尝试使用硬连线字符串或繁琐的服务文件加载类。

JDBC 本身并不多。源代码在 JDK 的 src.zip 中。DriverManager 是带有代码的类。

于 2008-11-06T15:52:44.137 回答
0

工具包是对的。从 JDBC 4.0 开始,驱动程序将使用J2SE Service Provider自动注册自己的机制。不幸的是,并非所有 JDBC 供应商都更新了他们的驱动程序来这样做。我还认为目前支持 JDBC 4.0 的 JDBC 驱动程序并不多。同时,您将需要创建一个 Driver 的实例来注册驱动程序。然后,DriverManager 将检查每个注册的驱动程序是否接受为 DriverManager.getConnection() 传递的 JDBC url。您可以启用驱动程序日志记录以查看如果驱动程序已注册并且 DriverManager 尝试找到合适的驱动程序会发生什么。因此只需调用 DriverManager.setLogStream() 或 DriverManager.setLogWriter() 之前。

这是我知道的 JDBC 4.0 驱动程序之一:http: //www.inetsoftware.de/products/jdbc/mssql/merlia

于 2008-11-10T11:11:25.560 回答