Java 为什么需要为每个连接使用JDBC write Class.forName(…)?

Java 为什么需要为每个连接使用JDBC write Class.forName(…)?,java,jdbc,Java,Jdbc,如果我想连接到数据库,我应该编写如下代码: Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/mysidorservicename", "sysdba", "password123"); 为什么要在连接到数据库之前加载具体的驱动程序?Class.forName语句的结果被忽略-加载的类显然

如果我想连接到数据库,我应该编写如下代码:

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/mysidorservicename", "sysdba", "password123");

为什么要在连接到数据库之前加载具体的驱动程序?
Class.forName
语句的结果被忽略-加载的类显然与
DriverManager
没有关联。我是否可以在应用程序启动时加载用于不同数据库的所有驱动程序,并且不会在每次连接之前编写
Class.forName
代码?

较旧的
DriverManager
实现(在JDBC 4.0之前,它是JDK 6的乐园),要求驱动程序具有将其注册到
DriverManager
的静态块。当驱动程序管理器加载类时,静态块只调用一次。对于您的问题-在哪里加载这些类并不重要,只要在尝试使用它们之前加载驱动程序即可

由于JDBC4.0(如上所述,它是JDK6的一部分),您根本不需要调用
Class.forName
。引述:

DriverManager
方法
getConnection
getDrivers
已得到增强,以支持Java标准版服务提供程序机制。JDBC4.0驱动程序必须包含META-INF/services/java.sql.Driver文件。此文件包含java.sql.Driver的JDBC驱动程序实现的名称。例如,要加载my.sql.Driver类,META-INF/services/java.sql.Driver文件将包含条目[etc..]


用外行的话说,由驱动程序自行注册以声明它为给定的连接字符串提供了JDBC服务,您可以从代码中删除
类.forName
调用。

有许多JDBC需要指定您正在使用的JDBC,这就是为什么要使用它,而不需要在每次连接之前编写它。您需要执行一次,使用现代驱动程序,您甚至不再需要
类.forName()
。建议阅读:。特别是它说“在以前的JDBC版本中…”