[1]在JDBC中,我们为什么要首先使用Class.forName(“some driver name”)加载驱动程序。 为什么SUN没有在getConnection()方法本身中处理加载驱动程序。如果我将驱动程序名称作为参数传递给getConnection()方法。
[2]我想了解JBDC的内部结构。对它的任何指示都表示赞赏。
答案 0 :(得分:8)
使用JDBC 4,您不再需要使用Class.forName(...),请参阅here一篇解释此内容的文章:
与数据库的连接要求在客户端的VM中加载合适的JDBC数据库驱动程序。在JDBC的早期阶段,通常通过Class.forName()加载合适的驱动程序,传入实现JDBC驱动程序接口的类的名称。之后,DriverManager类提供了一种更灵活的方法来管理客户端应用程序中的JDBC驱动程序。要使驱动程序可用,必须使用驱动程序的类名调用DriverManager的registerDriver()。或者,您可以通过jdbc.drivers系统属性指定要加载的驱动程序。当DriverManager初始化时,它会尝试加载与该属性关联的驱动程序。
JDBC 4添加了 J2SE服务提供程序 机制作为指定数据库驱动程序的另一种方法。为此,驱动程序JAR文件必须包含文件META-INF / services / java.sql.driver。该文件必须包含一行,其中包含JDBC驱动程序的Driver接口实现的名称。在DriverManager上调用getConnection()将加载一个如此打包的驱动程序(如果需要)。加载驱动程序后,将创建一个驱动程序实例,然后调用registerDriver()以使该驱动程序可供客户端使用。
有关JDBC的更多信息,请查看Sun's JDBC link。与其他一些规范相比,JDBC 4.0规范相对较好......
答案 1 :(得分:1)
如果只给它JDBC协议名称,java.sql无法知道要加载哪个类。可以说JDBC驱动程序jar文件应该能够在其清单或META-INF /下的其他地方指定协议名称和驱动程序类。在我看来,您可能自己构建驱动程序实例,而不是尝试使用硬连线字符串或fiddly服务文件加载类。
JDBC本身并不多。源代码位于JDK的src.zip中。 DriverManager是带代码的类。
答案 2 :(得分:0)
工具包是对的。由于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