连接到数据库时Class.forName(“ oracle.jdbc.driver.OracleDriver”)的实际用途是什么?


91

命令会是什么

Class.forName("oracle.jdbc.driver.OracleDriver")

连接到Oracle数据库时该怎么做?是否有另一种做同一件事的方式?


6
相关信息:stackoverflow.com/questions/5992126/loading-jdbc-driver注意,在应用程序启动期间,只需调用一次即可;您无需在应用程序生存期内每次都调用它就可以建立连接。
BalusC

@BalusC假设我在单独的类A中有我的连接详细信息,我Class.forName("oracle.jdbc.driver.OracleDriver")在类A构造函数中调用它,并且我创建了一个A's对象来获取我需要连接的每个servlet的连接字段,然后java将跳过Class.forName("oracle.jdbc.driver.OracleDriver")还是将再次加载?
阿西夫·穆斯塔克

Answers:


68

它使用FQCN(完全限定的类名)获取对类对象的引用oracle.jdbc.driver.OracleDriver

就连接数据库而言,它没有“做任何事情”, 除了确保指定的类由当前的classloader加载之外,它在。写作之间没有根本区别

Class<?> driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
// and
Class<?> stringClass = Class.forName("java.lang.String");

Class.forName("com.example.some.jdbc.driver") 来电显示在 使用JDBC的代码中,因为这是加载JDBC驱动程序的方法

Java教程

在早期版本的JDBC中,要获得连接,您首先必须通过调用方法来初始化JDBC驱动程序Class.forName。此方法需要一个类型的对象java.sql.Driver。每个JDBC驱动程序包含一个或多个实现该接口的类java.sql.Driver
...
在类路径中找到的所有JDBC 4.0驱动程序都会自动加载。(但是,您必须使用方法在JDBC 4.0之前手动加载任何驱动程序Class.forName。)

进一步阅读(阅读:问题是重复的)


29
换句话说,它允许您使用Driver类,而无需为类进行显式导入。这使您无需在类路径中使用Oracle驱动程序即可构建项目。
JustinKSU 2011年

3
应该注意的是,尽管以“传统方式”调用时,您Class.forName()不会捕获对返回的driverClass的引用,因此乍一看就像是无操作操作
matt b

11
这是因为JDBC驱动程序应该具有一个静态初始化程序,该初始化程序向DriverManager注册了该驱动程序。使用Class.forName()时,将执行此初始化程序并注册驱动程序。从JDBC 4.0开始,DriverManager本身使用ServiceLoader在类路径上查找驱动程序。
Mark Rotteveel 2011年

1
@MattBall,关于JDBC 4.0之前的版本,获得对驱动程序的引用或调用该驱动程序类的静态函数,将已经自动加载该驱动程序类。那么,为什么我们必须手动进行Class.forName("etc.driver")呢?
Pacerier,2014年

1
@Pacerier错误的假设。JDBC不知道您要加载哪个驱动程序,因此JDBC中没有任何内容(与驱动程序无关)可以引用该驱动程序类。因此,你需要一些触发类负载。我想可以使用静态方法代替Class.forName(...)
Matt Ball

13

它注册驱动程序;形式的东西:

public class SomeDriver implements Driver {
  static {
    try {
      DriverManager.registerDriver(new SomeDriver());
    } catch (SQLException e) {
      // TODO Auto-generated catch block
    }
  }

  //etc: implemented methods
}

6

Java JDBC教程中

在早期版本的JDBC中,要获得连接,您首先必须通过调用方法来初始化JDBC驱动程序Class.forName。在类路径中找到的所有JDBC 4.0驱动程序都会自动加载。(但是,您必须使用方法在JDBC 4.0之前手动加载任何驱动程序Class.forName。)

因此,如果您在Java 1.6上使用Oracle 11g(11.1)驱动程序,则无需调用Class.forName。否则,您需要调用它来初始化驱动程序。


1
@Jonathanwhat是什么意思,您可以解释一下“在JDBC 4.0之前使用Class.forName方法手动加载任何驱动程序”吗?
Aravind

Class.forName调用将强制类加载器加载给定的类。这是本教程中描述的手动加载步骤。
乔纳森

@Jonathan所以这就是为什么我的连接仍然无法工作的原因class.forName();:)
Asif Mushtaq

2

在Java 6之前的版本中,DriverManager该类不会知道您要使用哪个JDBC驱动程序。Class.forName("...")是预加载驱动程序类的一种方法。

如果您使用的是Java 6,则不再需要这样做。


是的,需要使用:OracleDataSource现在docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726并自行生成url:final OracleDataSource ds = new OracleDataSource(); ds.setDriverType(“ thin”); ds.setServerName(hostName); ds.setPortNumber(port); //ds.setDatabaseName(dbName); ds.setServiceName(dbName); 连接= ds.getConnection(user,pwd);
Rajesh Goel

1

该命令将Oracle jdbc驱动程序的类加载为对DriverManager实例可用。加载该类后,系统可以使用它连接到Oracle。或者,您可以使用DriverManager的registerDriver方法,并将其与所需的JDBC驱动程序实例一起传递。



0

使用oracle.jdbc.OracleDriver,而不是oracle.jdbc.driver.OracleDriver。如果驱动程序jar文件位于“ WEB-INF \ lib”目录中(如果使用的是Tomcat),则无需注册它。将其另存为test.jsp并将其放在您的Web目录中,然后在Tomcat管理器中重新部署您的Web应用程序文件夹:

<%@ page import="java.sql.*" %>

<HTML>
<HEAD>
<TITLE>Simple JSP Oracle Test</TITLE>
</HEAD><BODY>
<%
Connection conn = null;
try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XXX.XXX:XXXX:dbName", "user", "password");
    Statement stmt = conn.createStatement();
    out.println("Connection established!");
}
catch (Exception ex)
{
    out.println("Exception: " + ex.getMessage() + "");

}
finally
{
    if (conn != null) {
        try {
            conn.close();   
        }
        catch (Exception ignored) {
            // ignore
        }
    }
}

%>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.