94 votes

Quelle est l'utilité réelle de Class.forName("oracle.jdbc.driver.OracleDriver") lors de la connexion à une base de données ?

Quelle sera la commande

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

faire exactement lors de la connexion à une base de données Oracle ? Existe-t-il un autre moyen de faire la même chose ?

6 votes

En rapport : stackoverflow.com/questions/5992126/loading-jdbc-driver Notez que vous devez l'appeler une seule fois Vous n'avez pas besoin de l'appeler à chaque fois que vous obtenez une connexion pendant la durée de vie de l'application.

0 votes

@BalusC Supposons que j'ai le détail de ma connexion dans une classe séparée. A où j'appelle Class.forName("oracle.jdbc.driver.OracleDriver") en classe A et je crée A's pour obtenir le champ de connexion pour chaque servlet où j'ai besoin d'une connexion, alors java ignorera Class.forName("oracle.jdbc.driver.OracleDriver") ou se chargera à nouveau ?

73voto

Matt Ball Points 165937

Il obtient une référence à l'objet classe avec le FQCN (nom de classe pleinement qualifié). oracle.jdbc.driver.OracleDriver .

Il ne "fait" rien en termes de connexion à une base de données, à part s'assurer que la classe spécifiée est chargée par le classloader actuel . Il n'y a pas de différence fondamentale entre l'écriture

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

Class.forName("com.example.some.jdbc.driver") les appels apparaissent dans héritage qui utilise JDBC car qui est le héritage manière de charger un pilote JDBC .

De Le tutoriel Java :

Dans les versions précédentes de JDBC, pour obtenir une connexion, vous deviez d'abord initialiser votre pilote JDBC en appelant la méthode Class.forName . Cette méthode requiert un objet de type java.sql.Driver . Chaque pilote JDBC contient une ou plusieurs classes qui implémentent l'interface java.sql.Driver .
...
Tous les pilotes JDBC 4.0 qui se trouvent dans le chemin de vos classes sont automatiquement chargés. (Cependant, vous devez charger manuellement tout pilote antérieur à JDBC 4.0 avec la méthode Class.forName .)

Autres lectures <sup>(lire : les questions dont il s'agit en double)</sup>

29 votes

En d'autres termes, cela vous permet d'utiliser la classe Driver sans avoir une importation explicite pour votre classe. Cela vous permet de construire le projet sans avoir le pilote Oracle dans votre classpath.

3 votes

Il faut cependant noter que dans la "méthode traditionnelle", on appelle Class.forName() sans capturer la référence à la driverClass retournée, ce qui semble à première vue être une opération sans résultat.

11 votes

En effet, un pilote JDBC doit posséder un initialisateur statique qui enregistre le pilote auprès du DriverManager. En utilisant Class.forName(), cet initialisateur est exécuté et le pilote est enregistré. Depuis JDBC 4.0, le DriverManager lui-même utilise ServiceLoader pour trouver les pilotes dans le classpath.

13voto

McDowell Points 62645

Il enregistre le conducteur ; quelque chose de ce genre :

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

  //etc: implemented methods
}

7voto

Jonathan Points 3145

De la Tutoriel Java JDBC :

Dans les versions précédentes de JDBC, pour obtenir une connexion, vous deviez d'abord initialiser votre pilote JDBC en appelant la méthode Class.forName . Tous les pilotes JDBC 4.0 qui se trouvent dans le chemin de vos classes sont automatiquement chargés. (Cependant, vous devez charger manuellement tous les pilotes antérieurs à JDBC 4.0 avec la méthode Class.forName .)

Donc, si vous utilisez le pilote Oracle 11g (11.1) avec Java 1.6, vous n'avez pas besoin d'appeler Class.forName . Sinon, vous devez l'appeler pour initialiser le pilote.

1 votes

@Jonathanqu'est-ce que vous voulez dire par "charger manuellement tout pilote antérieur à JDBC 4.0 avec la méthode Class.forName" pouvez-vous expliquer ?

0 votes

Le site Class.forName force le classloader à charger la classe donnée. Il s'agit de l'étape de chargement manuel décrite dans le tutoriel.

0 votes

@Jonathan C'est donc pour cela que ma connexion fonctionne toujours sans class.forName(); :)

2voto

Qwerky Points 10847

Avant Java 6, le DriverManager n'aurait pas su quel pilote JDBC vous vouliez utiliser. Class.forName("...") était un moyen de précharger les classes de pilotes.

Si vous utilisez Java 6, vous n'avez plus besoin de le faire.

0 votes

Oui, il faut utiliser : OracleDataSource maintenant docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i10707‌​26 et il crée l'url tout seul : final OracleDataSource ds = new OracleDataSource() ; ds.setDriverType("thin") ; ds.setServerName(hostName) ; ds.setPortNumber(port) ; //ds.setDatabaseName(dbName) ; ds.setServiceName(dbName) ; connection = ds.getConnection(user, pwd) ;

1voto

anatolich Points 1

Cette commande charge la classe du pilote Oracle jdbc pour qu'elle soit disponible pour l'instance DriverManager. Une fois la classe chargée, le système peut se connecter à Oracle en l'utilisant. Comme alternative, vous pouvez utiliser la méthode registerDriver de DriverManager et lui passer l'instance du pilote JDBC dont vous avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X