Java Class.forName,JDBC连接加载驱动程序

时间:2013-08-05 12:55:52

标签: java mysql jdbc

在进行简单的JDBC连接时,所有资源都提供相同的代码

String driver = "com.mysql.jdbc.Driver";
Statement statement = null; 
Class.forName(driver); 
Connection conn  = DriverManager.getConnection(url + dbName,userName, password);

但我们实际上没有“Class.forName(driver)”。我们没有将它存储在任何地方。 有什么用,因为我们没有使用Class.forName(driver)的返回。

6 个答案:

答案 0 :(得分:3)

这是com.mysql.jdbc.Driver的一部分,它使用DriverManager注册自己

//
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

应该注意,由于版本1.6不需要使用Class.forName()显式加载JDBC驱动程序,因此DriverManager可以使用服务提供程序机制自动检测JDBC 4.0驱动程序。 JDBC驱动程序类名在META-INF / services / java.sql.Driver文件中写入

答案 1 :(得分:2)

Class.forName()尝试加载指定的类。在早期版本的JDBC中,这是必要的,因为Driver类要求以这种方式加载类。这个年龄段并不需要。

不要打电话,也不会发生任何不好的事。

出于某种原因,教程和示例仍以旧方式存在。

手动加载类的唯一微小好处是,如果你没有在类路径中获得正确的类,它会准确地告诉你问题是什么。

答案 2 :(得分:1)

class.forName()使ClassLoader将类加载到内存中。 JDBC驱动程序类包含一个静态初始化程序块,它使用DriverManager注册驱动程序以供以后参考。连接时,DriverManager使用数据库参数来查找正确的驱动程序

答案 3 :(得分:0)

Class.forName("driver.class");加载指定的JDBC驱动程序。当驱动程序加载时,它还会使用DriverManager注册自己。因此,当您致电DriverManager#getConnection()时,您可以通过之前加载的驱动程序建立Connection

DriverManager#getConnection()

  

当调用方法getConnection时,DriverManager将尝试从初始化时加载的驱动程序中找到合适的驱动程序,并使用与当前applet或应用程序相同的类加载器显式加载。

答案 4 :(得分:0)

使用Class.forName(..)加载课程。大多数java.sql.Driver实现(使用静态初始化程序)在加载类时使用java.sql.DriverManager实现注册自己。有关详细信息,请参阅JDBC 4.1规范中的9.2节:

  

JDBC驱动程序必须实现Driver接口,并且必须实现   包含一个静态初始化程序,它将在加载驱动程序时调用。这个   初始化程序使用DriverManager

注册自身的新实例

注册后,您可以使用该驱动程序创建连接。

然而,从JDBC 4.0(Java 6)开始,不再需要以这种方式加载符合JDBC 4.0规范的驱动程序,因为DriverManager本身将负责使用{{定位和加载JDBC驱动程序。 3}}机制。请参阅JDBC 4.1规范的9.2.1节:

  

DriverManager.getConnection方法已得到增强,可以支持   Java标准版服务提供程序机制。 JDBC 4.0驱动程序必须包含   文件META-INF/services/java.sql.Driver。该文件包含名称   JDBC驱动程序的java.sql.Driver实现。

答案 5 :(得分:0)

嗯,它确实有一个副作用 - 它将字符串名称指定的驱动程序加载到内存中。

在Java中,只有在实际需要使用类时才会加载类。

因此Class.forName()将导致类加载器“读取”字节码并将类定义加载到JVM的内存中。

现在发生这种情况时,会执行此类的静态初始化块(以及驱动程序应该有一个)(它应该是静态的,因为我们实际上并不创建此类的对象)。

写入此静态初始化块,以便在DriverManager中注册驱动程序。

这是一本'按书'的解释。当然,这个API并不是那么明确且不明显。 它可以明确地做到这一点:

Driver driver = (Driver)Class.forName("com.mysql.jdbc.Drivercom.mysql.jdbc.Driver").newInstance();
DriverManager.registerDriver(driver);

自Java 6以来,不再使用此机制。 阅读here有关加载驱动程序的新方法。

希望这有帮助