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

91

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 une autre façon de faire la même chose?

Aravind
la source
6
En relation: stackoverflow.com/questions/5992126/loading-jdbc-driver Notez que vous ne devez l'appeler qu'une seule fois , lors du démarrage de votre application; vous n'avez pas besoin de l'appeler à chaque fois avant d'obtenir une connexion pendant la durée de vie de l'application.
BalusC
@BalusC Supposons que j'ai mes détails de connexion dans une classe séparée Aoù j'appelle Class.forName("oracle.jdbc.driver.OracleDriver")dans le Aconstructeur de classe , et que je crée un A'sobjet pour obtenir le champ de connexion pour chaque servlet où j'ai besoin d'une connexion, puis java sautera Class.forName("oracle.jdbc.driver.OracleDriver")ou se chargera à nouveau?
Asif Mushtaq

Réponses:

68

Il obtient une référence à l'objet de classe avec le FQCN (nom de classe complet) 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 chargeur de classe 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 le code hérité qui utilise JDBC car c'est la manière héritée de charger un pilote JDBC .

À partir du didacticiel 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. Ces méthodes nécessitaient 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 trouvés dans votre chemin de classe sont automatiquement chargés. (Cependant, vous devez charger manuellement tous les pilotes avant JDBC 4.0 avec la méthode Class.forName.)

Lectures complémentaires (lire: questions dont c'est un dup)

Matt Ball
la source
29
En d'autres termes, il vous permet d'utiliser la classe Driver sans avoir une importation explicite pour votre classe. Cela vous permet de créer le projet sans avoir à avoir le pilote Oracle dans votre chemin de classe.
JustinKSU
3
il convient de noter cependant que dans la "manière héritée", vous appelleriez Class.forName()sans capturer la référence à la driverClass retournée, donc cela semble à première vue comme une opération sans opération
matt b
11
C'est parce qu'un pilote JDBC doit avoir un initialiseur statique qui enregistre le pilote avec DriverManager. Lors de l'utilisation de Class.forName (), cet initialiseur est exécuté et le pilote est enregistré. Depuis JDBC 4.0, DriverManager lui-même utilise ServiceLoader pour trouver les pilotes sur le chemin de classe.
Mark Rotteveel
1
@MattBall, Concernant le pré-JDBC 4.0, obtenir une référence au pilote ou appeler une fonction statique de cette classe de pilote chargerait déjà automatiquement la classe de pilote. Alors pourquoi devons-nous faire manuellement Class.forName("etc.driver")?
Pacerier
1
Hypothèse incorrecte de @Pacerier. JDBC ne sait pas quel pilote vous voulez charger, donc il n'y a rien dans JDBC (qui est indépendant du pilote) qui sait faire référence à la classe de pilote. Vous avez donc besoin de quelque chose qui déclenche un chargement de classe. Je suppose qu'une méthode statique fonctionnerait à la place de Class.forName(...).
Matt Ball
13

Il enregistre le pilote; quelque chose de la forme:

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

  //etc: implemented methods
}
McDowell
la source
6

À partir du didacticiel 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 trouvés dans votre chemin de classe sont automatiquement chargés. (Cependant, vous devez charger manuellement tous les pilotes avant 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.

Jonathan
la source
1
@Jonathan qu'entendez-vous par "charger manuellement tous les pilotes avant JDBC 4.0 avec la méthode Class.forName" pouvez-vous expliquer?
Aravind
L' Class.forNameappel force le chargeur de classe à charger la classe donnée. Il s'agit de l'étape de chargement manuel décrite dans le tutoriel.
Jonathan
@Jonathan Voilà pourquoi ma connexion fonctionne toujours sans class.forName();:)
Asif Mushtaq
2

Avant Java 6, la DriverManagerclasse 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.

Qwerky
la source
Oui, il faut utiliser: OracleDataSource maintenant docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 et il crée l'url tout seul: OracleDataSource final ds = new OracleDataSource (); ds.setDriverType ("fin"); ds.setServerName (hostName); ds.setPortNumber (port); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); connection = ds.getConnection (utilisateur, pwd);
Rajesh Goel
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 la transmettre avec l'instance du pilote JDBC dont vous avez besoin.

Anatolich
la source
0

Utilisez oracle.jdbc.OracleDriver et non oracle.jdbc.driver.OracleDriver. Vous n'avez pas besoin de l'enregistrer si le fichier jar du pilote se trouve dans le répertoire "WEB-INF \ lib", si vous utilisez Tomcat. Enregistrez-le sous le nom test.jsp et placez-le dans votre répertoire Web, puis redéployez votre dossier d'application Web dans le gestionnaire 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
        }
    }
}

%>
À M
la source