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
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)
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:
publicclassSomeDriverimplementsDriver{static{try{DriverManager.registerDriver(newSomeDriver());}catch(SQLException e){// TODO Auto-generated catch block}}//etc: implemented methods}
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 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.
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.
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:
A
où j'appelleClass.forName("oracle.jdbc.driver.OracleDriver")
dans leA
constructeur de classe , et que je crée unA's
objet pour obtenir le champ de connexion pour chaque servlet où j'ai besoin d'une connexion, puis java sauteraClass.forName("oracle.jdbc.driver.OracleDriver")
ou se chargera à nouveau?Réponses:
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.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 :
Lectures complémentaires (lire: questions dont c'est un dup)
la source
Class.forName()
sans capturer la référence à la driverClass retournée, donc cela semble à première vue comme une opération sans opérationClass.forName("etc.driver")
?Class.forName(...)
.Il enregistre le pilote; quelque chose de la forme:
la source
À partir du didacticiel Java JDBC :
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.la source
Class.forName
appel force le chargeur de classe à charger la classe donnée. Il s'agit de l'étape de chargement manuel décrite dans le tutoriel.class.forName();
:)Avant Java 6, la
DriverManager
classe 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.
la source
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.
la source
Une alternative consiste à utiliser la propriété System jdbc.drivers pour spécifier vos pilotes requis sur la ligne de commande lorsque vous démarrez la JVM.
la source
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:
la source