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 ?
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 ?
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 typejava.sql.Driver
. Chaque pilote JDBC contient une ou plusieurs classes qui implémentent l'interfacejava.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éthodeClass.forName
.)
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.
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.
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.
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éthodeClass.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.
@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 ?
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.
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 : 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) ;
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 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.
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'appelleClass.forName("oracle.jdbc.driver.OracleDriver")
en classeA
et je créeA's
pour obtenir le champ de connexion pour chaque servlet où j'ai besoin d'une connexion, alors java ignoreraClass.forName("oracle.jdbc.driver.OracleDriver")
ou se chargera à nouveau ?