Qual é o uso real de Class.forName (“oracle.jdbc.driver.OracleDriver”) durante a conexão com um banco de dados?

91

Qual será o comando

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

exatamente ao se conectar a um banco de dados Oracle? Existe uma maneira alternativa de fazer a mesma coisa?

Aravind
fonte
6
Relacionado: stackoverflow.com/questions/5992126/loading-jdbc-driver Observe que você precisa chamá-lo apenas uma vez , durante a inicialização do aplicativo; você não precisa chamá-lo todas as vezes antes de obter uma conexão durante a vida útil do aplicativo.
BalusC
@BalusC Suponha que eu tenha meus detalhes de conexão em uma classe separada Aonde chamo o construtor de Class.forName("oracle.jdbc.driver.OracleDriver")classe Ae crio um A'sobjeto para obter o campo de conexão para cada servlet onde preciso de conexão, então o java pulará Class.forName("oracle.jdbc.driver.OracleDriver")ou carregará novamente?
Asif Mushtaq de

Respostas:

68

Ele obtém uma referência ao objeto de classe com o FQCN (nome de classe totalmente qualificado) oracle.jdbc.driver.OracleDriver.

Ele não "faz" nada em termos de conexão a um banco de dados, além de garantir que a classe especificada seja carregada pelo carregador de classe atual . Não há diferença fundamental entre escrever

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

Class.forName("com.example.some.jdbc.driver")as chamadas aparecem no código legado que usa JDBC porque essa é a maneira legada de carregar um driver JDBC .

Do Tutorial Java :

Nas versões anteriores do JDBC, para obter uma conexão, primeiro você precisava inicializar o driver JDBC chamando o método Class.forName. Este método requer um objeto do tipo java.sql.Driver. Cada driver JDBC contém uma ou mais classes que implementam a interface java.sql.Driver.
...
Todos os drivers JDBC 4.0 encontrados em seu caminho de classe são carregados automaticamente. (No entanto, você deve carregar manualmente todos os drivers anteriores ao JDBC 4.0 com o método Class.forName.)

Leitura adicional (leia: perguntas de que é uma cópia)

Matt Ball
fonte
29
Em outras palavras, ele permite que você use a classe Driver sem ter uma importação explícita para sua classe. Isso permite que você construa o projeto sem ter que ter o driver Oracle em seu classpath.
JustinKSU
3
deve notar, porém, que no "modo legado" você chamaria Class.forName()sem capturar a referência ao driverClass retornado, então parece à primeira vista como uma operação sem operação
matt b
11
Isso ocorre porque um driver JDBC deve ter um inicializador estático que registra o driver com o DriverManager. Ao usar Class.forName (), este inicializador é executado e o driver é registrado. Desde o JDBC 4.0, o próprio DriverManager usa ServiceLoader para encontrar drivers no caminho de classe.
Mark Rotteveel
1
@MattBall, com relação ao pré-JDBC 4.0, obter uma referência ao driver ou chamar uma função estática dessa classe de driver já carregaria automaticamente a classe do driver. Então, por que temos que fazer manualmente Class.forName("etc.driver")?
Pacerier
1
Suposição incorreta da @Pacerier. JDBC não sabe qual driver você deseja carregar, portanto, não há nada no JDBC (que é independente de driver) que saiba se referir à classe do driver. Portanto, você precisa de algo que acione um carregamento de classe. Suponho que um método estático funcionaria em vez de Class.forName(...).
Matt Ball
13

Ele registra o driver; algo da forma:

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

  //etc: implemented methods
}
McDowell
fonte
6

No tutorial Java JDBC :

Nas versões anteriores do JDBC, para obter uma conexão, primeiro você precisava inicializar o driver JDBC chamando o método Class.forName. Todos os drivers JDBC 4.0 encontrados em seu caminho de classe são carregados automaticamente. (No entanto, você deve carregar manualmente todos os drivers anteriores ao JDBC 4.0 com o método Class.forName.)

Portanto, se estiver usando o driver Oracle 11g (11.1) com Java 1.6, você não precisa chamar Class.forName. Caso contrário, você precisa chamá-lo para inicializar o driver.

Jonathan
fonte
1
@ Jonathan, o que você quer dizer com "carregar manualmente qualquer driver anterior ao JDBC 4.0 com o método Class.forName", pode explicar?
Aravind
A Class.forNamechamada força o carregador de classe a carregar a classe fornecida. Esta é a etapa de carregamento manual descrita no tutorial.
Jonathan
@Jonathan É por isso que minha conexão ainda funciona sem class.forName();:)
Asif Mushtaq
2

Antes do Java 6, a DriverManagerclasse não saberia qual driver JDBC você queria usar. Class.forName("...")era uma maneira de pré-carregar as classes de driver.

Se você estiver usando o Java 6, não precisa mais fazer isso.

Qwerky
fonte
Sim, é necessário usar: OracleDataSource now docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 e cria a url por conta própria: final OracleDataSource ds = new OracleDataSource (); ds.setDriverType ("thin"); ds.setServerName (hostName); ds.setPortNumber (porta); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); conexão = ds.getConnection (usuário, pwd);
Rajesh Goel
1

Este comando carrega a classe do driver Oracle jdbc que fica disponível para a instância do DriverManager. Depois que a classe é carregada, o sistema pode se conectar ao Oracle usando-a. Como alternativa, você pode usar o método registerDriver do DriverManager e passá-lo com a instância do driver JDBC que você precisa.

Anatolich
fonte
0

Use oracle.jdbc.OracleDriver, não oracle.jdbc.driver.OracleDriver. Você não precisa registrá-lo se o arquivo jar do driver estiver no diretório "WEB-INF \ lib", se você estiver usando o Tomcat. Salve-o como test.jsp e coloque-o no diretório da web e reimplante a pasta do aplicativo da web no gerenciador do Tomcat:

<%@ 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
        }
    }
}

%>
Tom
fonte