Relacionado: stackoverflow.com/questions/5992126/loading-jdbc-driver Tenga en cuenta que debe llamarlo solo una vez , durante el inicio de la aplicación; no es necesario llamarlo cada vez antes de obtener una conexión durante la vida útil de la aplicación.
BalusC
@BalusC Supongamos que tengo los detalles de mi conexión en una clase separada Adonde llamo Class.forName("oracle.jdbc.driver.OracleDriver")al Aconstructor de la clase , y creo un A'sobjeto para obtener el campo de conexión para cada servlet donde necesito conexión, entonces java saltará Class.forName("oracle.jdbc.driver.OracleDriver")o se cargará nuevamente.
Asif Mushtaq
Respuestas:
68
Obtiene una referencia al objeto de clase con el FQCN (nombre de clase totalmente calificado) oracle.jdbc.driver.OracleDriver.
No "hace" nada en términos de conectarse a una base de datos, aparte de garantizar que el cargador de clases actual cargue la clase especificada . No hay diferencia fundamental entre escribir
En versiones anteriores de JDBC, para obtener una conexión, primero tenía que inicializar su controlador JDBC llamando al método Class.forName. Estos métodos requieren un objeto de tipo java.sql.Driver. Cada controlador JDBC contiene una o más clases que implementan la interfaz java.sql.Driver.
...
Todos los controladores JDBC 4.0 que se encuentran en su ruta de clases se cargan automáticamente. (Sin embargo, debe cargar manualmente cualquier controlador anterior a JDBC 4.0 con el método Class.forName).
Lectura adicional (lea: preguntas de las que este es un duplicado)
En otras palabras, le permite usar la clase Driver sin tener una importación explícita para su clase. Esto le permite construir el proyecto sin tener que tener el controlador de Oracle en su classpath.
JustinKSU
3
Sin embargo, debe tener en cuenta que, en la "forma heredada", llamaría Class.forName()sin capturar la referencia al driverClass devuelto, por lo que a primera vista parece una operación no operativa
matt b
11
Esto se debe a que un controlador JDBC debe tener un inicializador estático que registre el controlador con DriverManager. Cuando se usa Class.forName (), este inicializador se ejecuta y el controlador se registra. Desde JDBC 4.0, el propio DriverManager usa ServiceLoader para encontrar controladores en la ruta de clases.
Mark Rotteveel
1
@MattBall, con respecto a la versión anterior a JDBC 4.0, obtener una referencia al controlador o llamar a una función estática de esa clase de controlador ya cargaría automáticamente la clase de controlador. Entonces, ¿por qué tenemos que hacerlo manualmente Class.forName("etc.driver")?
Pacerier
1
@Pacerier suposición incorrecta. JDBC no sabe qué controlador desea cargar, por lo que no hay nada en JDBC (que es independiente del controlador) que sepa hacer referencia a la clase de controlador. Entonces necesitas algo que active una carga de clase. Supongo que un método estático funcionaría en lugar de Class.forName(...).
Matt Ball
13
Registra al conductor; algo de la forma:
publicclassSomeDriverimplementsDriver{static{try{DriverManager.registerDriver(newSomeDriver());}catch(SQLException e){// TODO Auto-generated catch block}}//etc: implemented methods}
En versiones anteriores de JDBC, para obtener una conexión, primero tenía que inicializar su controlador JDBC llamando al método Class.forName. Todos los controladores JDBC 4.0 que se encuentran en su ruta de clases se cargan automáticamente. (Sin embargo, debe cargar manualmente cualquier controlador anterior a JDBC 4.0 con el método Class.forName).
Por lo tanto, si está utilizando el controlador Oracle 11g (11.1) con Java 1.6, no necesita llamar Class.forName. De lo contrario, debe llamarlo para inicializar el controlador.
@Jonathan¿Qué quiere decir con "cargar manualmente cualquier controlador anterior a JDBC 4.0 con el método Class.forName", puede explicarlo?
Aravind
La Class.forNamellamada obliga al cargador de clases a cargar la clase dada. Este es el paso de carga manual descrito en el tutorial.
Jonathan
@Jonathan Así que es por eso que mi conexión sigue funcionando sin class.forName();:)
Asif Mushtaq
2
Antes de Java 6, la DriverManagerclase no habría sabido qué controlador JDBC quería usar. Class.forName("...")era una forma de precargar las clases de controladores.
Si está utilizando Java 6, ya no necesita hacer esto.
Sí, es necesario usar: OracleDataSource ahora docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 y crea la URL por sí sola: final OracleDataSource ds = new OracleDataSource (); ds.setDriverType ("delgado"); ds.setServerName (nombre de host); ds.setPortNumber (puerto); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); conexión = ds.getConnection (usuario, pwd);
Rajesh Goel
1
Este comando carga la clase del controlador jdbc de Oracle para que esté disponible para la instancia de DriverManager. Una vez cargada la clase, el sistema puede conectarse a Oracle usándola. Como alternativa, puede usar el método registerDriver de DriverManager y pasarlo con la instancia del controlador JDBC que necesita.
Utilice oracle.jdbc.OracleDriver, no oracle.jdbc.driver.OracleDriver. No es necesario que lo registre si el archivo jar del controlador está en el directorio "WEB-INF \ lib", si está utilizando Tomcat. Guarde esto como test.jsp y colóquelo en su directorio web, y vuelva a implementar la carpeta de su aplicación web en el administrador de Tomcat:
A
donde llamoClass.forName("oracle.jdbc.driver.OracleDriver")
alA
constructor de la clase , y creo unA's
objeto para obtener el campo de conexión para cada servlet donde necesito conexión, entonces java saltaráClass.forName("oracle.jdbc.driver.OracleDriver")
o se cargará nuevamente.Respuestas:
Obtiene una referencia al objeto de clase con el FQCN (nombre de clase totalmente calificado)
oracle.jdbc.driver.OracleDriver
.No "hace" nada en términos de conectarse a una base de datos, aparte de garantizar que el cargador de clases actual cargue la clase especificada . No hay diferencia fundamental entre escribir
Class.forName("com.example.some.jdbc.driver")
las llamadas aparecen en código heredado que usa JDBC porque esa es la forma heredada de cargar un controlador JDBC .Desde el tutorial de Java :
Lectura adicional (lea: preguntas de las que este es un duplicado)
fuente
Class.forName()
sin capturar la referencia al driverClass devuelto, por lo que a primera vista parece una operación no operativaClass.forName("etc.driver")
?Class.forName(...)
.Registra al conductor; algo de la forma:
fuente
Desde el tutorial de Java JDBC :
Por lo tanto, si está utilizando el controlador Oracle 11g (11.1) con Java 1.6, no necesita llamar
Class.forName
. De lo contrario, debe llamarlo para inicializar el controlador.fuente
Class.forName
llamada obliga al cargador de clases a cargar la clase dada. Este es el paso de carga manual descrito en el tutorial.class.forName();
:)Antes de Java 6, la
DriverManager
clase no habría sabido qué controlador JDBC quería usar.Class.forName("...")
era una forma de precargar las clases de controladores.Si está utilizando Java 6, ya no necesita hacer esto.
fuente
Este comando carga la clase del controlador jdbc de Oracle para que esté disponible para la instancia de DriverManager. Una vez cargada la clase, el sistema puede conectarse a Oracle usándola. Como alternativa, puede usar el método registerDriver de DriverManager y pasarlo con la instancia del controlador JDBC que necesita.
fuente
Una alternativa sería utilizar la propiedad del sistema jdbc.drivers para especificar los controladores necesarios en la línea de comandos cuando inicie la JVM.
fuente
Utilice oracle.jdbc.OracleDriver, no oracle.jdbc.driver.OracleDriver. No es necesario que lo registre si el archivo jar del controlador está en el directorio "WEB-INF \ lib", si está utilizando Tomcat. Guarde esto como test.jsp y colóquelo en su directorio web, y vuelva a implementar la carpeta de su aplicación web en el administrador de Tomcat:
fuente