'Class.forName("MY_JDBC_DRIVER")'的目的是什么?

Kan*_*mar 22 java jdbc

我知道类加载对于在运行时使用类名加载类很有用.

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

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

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

编辑1:

DriverManagerAPI文档指出,

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

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

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

Joa*_*uer 24

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

如果你不使用当前的JDK(或者如果您有没有一个JDBC驱动程序具有设置为使用该机制将相应的文件),则驱动程序需要与注册DriverManager使用registerDriver.该方法通常从实际驱动程序类的静态初始化程序块调用,该类在第一次加载时被触发,因此发出Class.forName()确保驱动程序自行注册(如果尚未完成).

无论您是使用Class.forName()新服务提供程序还是新服务提供程序机制,您始终都需要类路径上的JDBC驱动程序(ClassLoader至少在运行时通过某些程序可用).

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


Eug*_*hov 12

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!");
     }
   }
 }
Run Code Online (Sandbox Code Playgroud)

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

或者,您可以使用特定于数据库的DataSource,然后可以声明性地指定数据源类型,例如在Spring上下文或Web服务器JNDI中.这是一个例子.

  • 从技术上讲,这是在加载Class时调用的,不一定是在`Class.forName()`上调用的,这只是强制卸载类的一种方法. (2认同)