JDBC Class.forName和DriverManager.registerDriver
与forName
方法和registerDriver
加载和注册JDBC驱动程序有什么不同?
Class.forName()
根本不与JDBC直接相关。 它只是加载一个类。
大多数JDBC驱动程序类通过调用registerDriver()
注册自己的静态初始化程序。
registerDriver()
是您几乎不需要自己调用的真正调用(除非您编写自己的JDBC驱动程序)。
请注意,在JDBC 4 中,如果JDBC驱动程序是最新的,则不需要这两者中的任何一个 ,因为可以使用服务定位机制来find驱动程序(也就是简单地忽略该调用并像往常一样打开连接)。 有关详细信息,请参阅DriverManager
的文档 :
DriverManager方法
getConnection
和getDrivers
已得到增强,以支持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)。