【发布时间】:2010-09-21 02:45:24
【问题描述】:
[1] 在 JDBC 中,为什么要首先使用 Class.forName("some driver name") 加载驱动程序。 为什么 SUN 不负责在 getConnection() 方法本身中加载驱动程序。如果我将驱动程序名称作为参数传递给 getConnection() 方法。
[2] 我想了解 JBDC 的内部结构。任何指向它的指针都值得赞赏。
【问题讨论】:
[1] 在 JDBC 中,为什么要首先使用 Class.forName("some driver name") 加载驱动程序。 为什么 SUN 不负责在 getConnection() 方法本身中加载驱动程序。如果我将驱动程序名称作为参数传递给 getConnection() 方法。
[2] 我想了解 JBDC 的内部结构。任何指向它的指针都值得赞赏。
【问题讨论】:
使用 JDBC 4,您不再需要使用 Class.forName(...) 请参阅 here 以获得一篇解释此问题的文章:
与数据库的连接要求在客户端的 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() 以使该驱动程序可供客户端使用。
查看Sun's JDBC link 了解有关 JDBC 的更多信息。与其他一些规范相比,JDBC 4.0 规范读起来比较好……
【讨论】:
如果只给 java.sql 指定 JDBC 协议名称,它就无法知道要加载哪个类。可以说 JDBC 驱动程序 jar 文件应该能够在其清单中或 META-INF/ 下的其他位置指定协议名称和驱动程序类。在我看来,您最好自己构建驱动程序实例,而不是尝试使用硬连线字符串或繁琐的服务文件加载类。
JDBC 本身并不多。源代码在 JDK 的 src.zip 中。 DriverManager 是带代码的类。
【讨论】:
工具包 是对的。从 JDBC 4.0 开始,驱动程序将使用 J2SE 服务提供者 自动注册自己的机制。不幸的是,并非所有 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
【讨论】: