I\'m trying to load the JDBC driver dynamically with this kind of code:
try{
URL[] url={new URL(\"file:libs/mysql-connector-java-5.1.21.jar\")};
that's a known issue with DriverManager and classloaders, see:
http://www.kfu.com/~nsayer/Java/dyn-jdbc.html
Driver definition (basically a delegate):
class DriverShim implements Driver {
private Driver driver;
DriverShim(Driver d) { this.driver = d; }
public boolean acceptsURL(String u) throws SQLException {
return this.driver.acceptsURL(u);
}
public Connection connect(String u, Properties p) throws SQLException {
return this.driver.connect(u, p);
}
// and so on....
Use example:
URL u = new URL("jar:file:/path/to/pgjdbc2.jar!/");
String classname = "org.postgresql.Driver";
URLClassLoader ucl = new URLClassLoader(new URL[] { u });
Driver d = (Driver)Class.forName(classname, true, ucl).newInstance();
DriverManager.registerDriver(new DriverShim(d));
DriverManager.getConnection("jdbc:postgresql://host/db", "user", "pw");
You cannot do it this way, because DriverManager doesn't allow you to use drivers that the calling code doesn't have access to (i.e. drivers loaded by different classloader):
When the method
getConnection
is called, theDriverManager
will attempt to locate a suitable driver from amongst those loaded at initialization and those loaded explicitly using the same classloader as the current applet or application.
As far as I know the only possible workaround is to instantiate Driver
manually instead of using DriverManager
(assuming that it has a no-arg constructor):
Driver driver = Class.forName(drivername, true, loader).newInstance();
Connection connect = driver.connect(url, props);
Though I'm not sure that it's a correct approach.