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
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)
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:
publicclassSomeDriverimplementsDriver{static{try{DriverManager.registerDriver(newSomeDriver());}catch(SQLException e){// TODO Auto-generated catch block}}//etc: implemented methods}
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, 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.
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.
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:
A
onde chamo o construtor deClass.forName("oracle.jdbc.driver.OracleDriver")
classeA
e crio umA's
objeto 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?Respostas:
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.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 :
Leitura adicional (leia: perguntas de que é uma cópia)
fonte
Class.forName()
sem capturar a referência ao driverClass retornado, então parece à primeira vista como uma operação sem operaçãoClass.forName("etc.driver")
?Class.forName(...)
.Ele registra o driver; algo da forma:
fonte
No tutorial Java JDBC :
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.fonte
Class.forName
chamada força o carregador de classe a carregar a classe fornecida. Esta é a etapa de carregamento manual descrita no tutorial.class.forName();
:)Antes do Java 6, a
DriverManager
classe 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.
fonte
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.
fonte
Uma alternativa seria usar a propriedade do sistema jdbc.drivers para especificar os drivers necessários na linha de comando ao iniciar a JVM.
fonte
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:
fonte