[1] 在JDBC中,为什么我们应该首先使用Class.forName(“某个驱动程序名称”)加载驱动程序。为什么SUN没有处理在getConnection()方法本身内加载驱动程序。如果我将驱动程序名称作为参数传递给getConnection()方法。
[2] 我想了解JBDC的内部原理。对此有任何指针都将不胜感激。
JDBC 4已经不再需要使用Class.forName(...),请参见这里的一篇文章进行解释:
连接到数据库需要在客户端的虚拟机中加载适当的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规范相对容易阅读...
如果你只给出JDBC协议名称,java.sql无法知道要加载哪个类。可以说,JDBC驱动程序jar文件应该能够在其清单或META-INF/下的其他位置指定协议名称和驱动程序类。我认为,与其尝试使用硬编码字符串或繁琐的服务文件加载类,不如自己构建驱动程序实例。
JDBC本身并没有太多内容。源代码在JDK的src.zip中。DriverManager是具有代码的类。
Toolkit 是正确的。自从JDBC 4.0以来,驱动程序会使用J2SE服务提供者自动注册机制进行自我注册。不幸的是,并非所有的JDBC供应商都更新了他们的驱动程序。我也认为目前并没有太多JDBC驱动程序支持JDBC 4.0。与此同时,您需要创建一个Driver实例来注册驱动程序。然后,DriverManager将检查每个已注册的驱动程序是否接受传递给DriverManager.getConnection()的JDBC URL。您可以启用驱动程序日志记录以查看驱动程序是否已注册以及DriverManager如何寻找合适的驱动程序。因此,在此之前只需调用DriverManager.setLogStream()或DriverManager.setLogWriter()即可。
这是我知道的JDBC 4.0驱动程序之一:http://www.inetsoftware.de/products/jdbc/mssql/merlia