为什么需要使用JDBC为每个连接写入Class.forName(...)?

时间:2016-08-24 06:46:39

标签: java jdbc

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

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

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

1 个答案:

答案 0 :(得分:3)

较早的DriverManager实现(在JDBC 4.0之前,它是JDK 6的驻留),要求驱动程序有一个静态块,将它们注册到DriverManager。当驱动程序管理器加载类时,会调用静态块一次。对于您的问题 - 只要在尝试使用它们之前加载驱动程序,加载这些类的位置并不重要。

自JDBC 4.0(如上所述,JDK 6的一部分)以来,您根本不必调用Class.forName。引用DriverManager's javadoc

  

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文件将包含条目[etc ..]

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