JDBC Class.forName vs DriverManager.registerDriver

xde*_*000 61 java jdbc

哪种forName方法与registerDriver加载和注册JDBC驱动程序的区别?

Joa*_*uer 83

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

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

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

请注意,在JDBC 4 中,如果您的JDBC驱动程序是最新的,则不需要其中任何一个,因为可以使用服务定位机制找到驱动程序(即只是忽略该调用并像往常一样打开您的连接).有关详细信息,请参阅文档DriverManager:

在DriverManager的方法getConnectiongetDrivers已得到增强,支持Java标准版服务提供商的机制.JDBC 4.0驱动程序必须包含该文件META-INF/services/java.sql.Driver.此文件包含JDBC驱动程序实现的名称java.sql.Driver.例如,要加载my.sql.Driver类,META-INF/services/java.sql.Driver文件将包含以下条目:

my.sql.Driver
Run Code Online (Sandbox Code Playgroud)

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

  • 作为示例,请查看[MySQL JDBC驱动程序源代码](http://www.docjar.com/html/api/com/mysql/jdbc/Driver.java.html).它在静态初始化程序中调用`registerDriver`. (3认同)
  • @xdevel:我不明白你要做什么.如果你想要做的就是连接数据库并且你有一个足够现代的JDBC驱动程序,那么你就不需要任何`Class.forName()`,`registerDriver`或`getDriver()`.您只需调用`DriverManager.getConnection("jdbc:mysql:// localhost")`而无需任何其他准备工作.如果你想做别的事情,那么请告诉我们那是什么. (3认同)
  • 好的,请耐心等待:)我的问题只是为了更好地理解JDBC驱动程序注册机制. (2认同)
  • @Pacerier:是的,我希望这种情况发生,而且我不知道 JDBC 框架会如何反应(我希望它要么忽略第二次调用,要么在第二次调用时抛出异常,无论哪种方式,驱动程序将被注册)。正如我在答案中所写:除非您正在编写自己的 JDBC 驱动程序,否则实际上没有理由自己调用 `registerDriver`。 (2认同)

Dav*_*ara 20

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

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