public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers
// --------------------------------------------- //
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
} // ~ Constructors
// ----------------------------------------------------------- /**
 * Construct a new driver and register it with DriverManager
 * 
 * @throws SQLException
 *             if a database error occurs.
 */
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
上面是com.mysql.jdbc.Driver的源代码。通常,我们通过如下的语句进行驱动注册:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
这个方法的代码如下: public static synchronized void registerDriver(java.sql.Driver driver)
        throws SQLException {        /* Register the driver if it has not already been added to our list */
        if(driver != null) {
            registeredDrivers.addIfAbsent(new DriverInfo(driver));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }        println("registerDriver: " + driver);    }
可是看上面的Driver源代码中,有这么一段:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}也就是说,在new Driver()的时候,就已经完成了注册,为什么我们还需要使用DriverManager.registerDriver(new com.mysql.jdbc.Driver());这句代码完成注册。直接 new com.mysql.jdbc.Driver(); 不就可以了么?

解决方案 »

  1.   

    楼主可以测试一下用new com.mysql.jdbc.Driver()代替注册驱动试试,注意要用比较旧的版本。
    JDK1.6之后开始支持JDBC4.0,已经不需要显示注册驱动了。
    JDBC 4.0 的规范规定,所有 JDBC 4.0 的驱动 jar 文件必须包含一个 java.sql.Driver,它位于 jar 文件的 META-INF/services 目录下。这个文件里每一行便描述了一个对应的驱动类。
    如果楼主的驱动包里没有这个目录,那就是旧的了,例如connector-java-3.0.11-stable-bin.jar。
    楼主可以搜一下jdk1.6新特性中关于jdbc4.0的那部分。