'Class.forName(“MY_JDBC_DRIVER”)'的用途是什么?

2022-09-01 18:40:38

我知道类加载对于在运行时加载类及其类名很有用。

但是,在我们的项目中使用JDBC时,我们知道我们将要使用哪个驱动程序,并且大多数驱动程序管理器字符串是硬编码的。

我的问题是:为什么我们在这里加载驱动程序?
为什么我们不能继续在类路径中添加驱动程序?因为我们知道我们将使用哪个驱动程序罐。Class.forName("JDBC_DRIVER")

我相信会将驱动程序加载到.这是唯一的原因吗?Class.forName(JDBC_DRIVER)DriverManager

编辑 1:

DriverManager API 文档指出

作为其 (DriverManager) 初始化的一部分,DriverManager 类将尝试加载“jdbc.drivers”系统属性中引用的驱动程序类。

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

然后当我使用甲骨文以外的驱动程序时;是否需要更改系统属性中的驱动程序名称字符串?


答案 1

首先:使用现代JDBC驱动程序和当前的JDK(至少是Java 6),不再需要调用。JDBC 驱动程序类现在使用服务提供程序机制进行定位。您应该能够简单地删除该调用并保持代码的其余部分不变,它应该可以继续工作。Class.forName()

如果您没有使用当前的 JDK(或者您的 JDBC 驱动程序没有设置适当的文件来使用该机制),则需要向 using registerDriver 注册该驱动程序。该方法通常从实际驱动程序类的静态初始值设定项块调用,该块在首次加载类时触发,因此发出该方法可确保驱动程序自行注册(如果尚未完成)。DriverManagerClass.forName()

无论你使用的是新的服务提供者机制,你总是需要类路径上的JDBC驱动程序(或者至少在运行时可以通过某些驱动程序获得)。Class.forName()ClassLoader

tl;dr:是的,该调用的唯一用途是确保驱动程序已注册。如果使用当前的 JDK 和当前的 JDBC 驱动程序,则不再需要此调用。Class.forName()


答案 2

Class.forName(JDBC_DRIVER) 调用将在 DriverManager 中注册您的 JDBC 驱动程序,因此您可以通过 url 对其进行寻址,例如 “jdbc:odbc:Database” 等等。

通常驱动程序类具有这样的静态初始化代码,该代码在Class.forName()上调用:

 public class Driver implements java.sql.Driver {
   static {
     try {
        DriverManager.registerDriver(new Driver());
     } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
     }
   }
 }

您仍然必须将 JDBC 驱动程序 jar 放入类路径中。

作为替代方法,您可以使用特定于数据库的数据源,然后可以声明性地指定数据源类型,例如在Spring上下文或Web服务器JNDI中。下面是一个示例


推荐