Charger dynamiquement le pilote JDBC
Je suis en train de charger le pilote JDBC de façon dynamique, avec ce genre de code:
try{
URL[] url={new URL("file:libs/mysql-connector-java-5.1.21.jar")};
URLClassLoader loader = new URLClassLoader(url, System.class.getClassLoader());
loader.loadClass(drivername);
Enumeration<Driver> drivers = DriverManager.getDrivers();
while(drivers.hasMoreElements()){
Driver driver = drivers.nextElement();
System.out.println("driver:"+driver);
}
Class.forName(drivername, true, loader);
drivers = DriverManager.getDrivers();
while(drivers.hasMoreElements()){
Driver driver = drivers.nextElement();
System.out.println("driver:"+driver);
}
Connection connect = DriverManager.getConnection(jdbcurl, user,
password);
return connect;
}
catch (MalformedURLException e){
e.printStackTrace();
return null;
}
Le premier tout-boucle affiche les pilotes de la classpath:
driver:sun.jdbc.odbc.JdbcOdbcDriver@35712651
driver:oracle.jdbc.OracleDriver@58df0438
driver:com.ibm.db2.jcc.DB2Driver@525c7734
driver:SQLServerDriver:1
et la deuxième boucle affiche les mêmes pilotes, mais sans le pilote MySQL.
Ma Question est pourquoi? Ai-je raté quelque chose?
J'ai lu dans la JavaDoc de DriverManager
que chaque conducteur tente d'inscrire lui-même par le drivermanager, si le pilote est chargé. Dans mon Code, cela devrait être loader.loadClass(drivername);
. Je pensais que ce code doit invoquer la partie statique par exemple:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
OriginalL'auteur bkb | 2013-01-23
Vous devez vous connecter pour publier un commentaire.
c'est un problème connu avec DriverManager et chargeurs de classes, voir:
http://www.kfu.com/~nsayer/Java/dyn-jdbc.html
Définition de pilote (en gros, un délégué):
Exemple d'utilisation:
Euw, qui met un chargé dynamiquement pilote dans une beaucoup trop de portée plus large. Mieux construire le
Driver
et de l'utiliser sans la méchanceté deDriverManager
.c'est une bonne idée si vous savez ce SGBDR l'URL sera pour, mais dans certaines situations, vous ne pouvez pas savoir.
OriginalL'auteur Riccardo Cossu
Vous ne pouvez pas le faire de cette façon, parce que
DriverManager
ne vous autorise pas à utiliser les pilotes que le code appelant n'a pas accès (par exemple, les pilotes chargés par les différents chargeurs de classe):Autant que je sache, la seule solution possible consiste à instancier
Driver
manuellement au lieu d'utiliserDriverManager
(en supposant que c'est un no-arg constructeur):Si je ne suis pas sûr que c'est une bonne approche.
Constructor
commeClass.newInstance
est méchant.OriginalL'auteur axtavt