JDBC Class.forName和DriverManager.registerDriver

forName方法和registerDriver加载和注册JDBC驱动程序有什么不同?

Class.forName()根本不与JDBC直接相关。 它只是加载一个类。

大多数JDBC驱动程序类通过调用registerDriver()注册自己的静态初始化程序。

registerDriver()是您几乎不需要自己调用的真正调用(除非您编写自己的JDBC驱动程序)。

请注意,在JDBC 4 中,如果JDBC驱动程序是最新的,则不需要这两者中的任何一个 ,因为可以使用服务定位机制来find驱动程序(也就是简单地忽略该调用并像往常一样打开连接)。 有关详细信息,请参阅DriverManager的文档 :

DriverManager方法getConnectiongetDrivers已得到增强,以支持Java Standard Edition Service Provider机制。 JDBC 4.0驱动程序必须包含文件META-INF/services/java.sql.Driver 。 该文件包含java.sql.Driver的JDBC驱动程序实现的名称。 例如,要加载my.sql.Driver类, META-INF/services/java.sql.Driver文件将包含条目:

 my.sql.Driver 

应用程序不再需要使用Class.forName()来显式加载JDBC驱动程序。 当前使用Class.forName()加载JDBC驱动程序的程序将继续工作而不进行修改。

切勿手动调用DriverManager.registerDriver()方法。 JDBC规范要求驱动程序在加载类时注册自己,并通过Class.forName()加载类。 在JDBC 4中,只需通过类path就可以自动加载驱动程序。

DriverManager.registerDriver()手动有潜在危险,因为它实际上导致驱动程序被注册两次。 如果你的代码要求你注销一个驱动程序来防止内存泄漏,那么你最终只会注销一次,并留下第二个实例注册。

关于Joachim Sauer已经提到的有关JDBC 4驱动程序的内容,请注意在实际中,您通常要注入一个EntityManager(JPA)或一个池数据源(并使用Spring的JdbcTemplate)。