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

时间:2011-10-05 14:26:55

标签: java jdbc

我理解类加载对于在运行时使用类名加载类很有用。

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

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

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

修改1:

DriverManager API doc表示

  

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

     

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

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

4 个答案:

答案 0 :(得分:24)

首先:使用现代JDBC驱动程序和当前JDK(至少是Java 6),不再需要调用Class.forName()JDBC driver classes are now located使用service provider mechanism。你能够简单地删除该调用并保持其余代码不变,并且它应该继续工作。

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

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

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

答案 1 :(得分: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!");
     }
   }
 }

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

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

答案 2 :(得分:4)

将类放在类路径中是不足以让类加载器加载它。并且必须加载驱动程序类以确保它已注册到JDBC API。顺便说一句,要使Class.forName工作,驱动程序类必须在类路径中。

答案 3 :(得分:2)

在许多工业应用中,我们希望通过以属性文件/配置文件的形式提取此类信息,从其余代码中抽象数据访问层。在这些情况下,我们可能需要像您一样使用某些东西。

例如我们可以使用JDBC接口类来编写访问数据库的代码,您可以通过选择要用作数据库的技术(例如ojdbc驱动程序或mysql jdbc驱动程序等)来配置属性。在这些情况下,可以使用这种方法加载类。