每当我运行以下代码时:
public void insertIntoMysql() {
URLClassLoader childCl = new URLClassLoader(new URL[] {new URL("file:///myProjectDir/lib/mysql-connector-java-5.0.8-bin.jar")}, this.getClass().getClassLoader());
try {
// connect to mysql
Class.forName("com.mysql.jdbc.Driver", true, childCl);
String myUrl = "jdbc:mysql://localhost:3306/myDB";
Connection conn = DriverManager.getConnection(myUrl, "root", "adminpw");
...
} catch {
...
}
}
调用DriverManager时,出现“ java.sql.SQLException:找不到适用于jdbc:mysql:// localhost:3306 / myDB的驱动程序”错误。
我猜想这与我用自定义类加载器加载驱动程序有关(我无法修改调用代码,因此无法更改调用脚本时加载的类路径)。似乎在Class.forName行中找到了驱动程序,但是好像该类仅在两行之后才加载。
有什么想法吗?
- - 更新 - -
我想出了如何在运行时使用BeanShell util将jar添加到我的类路径,如何删除过时的forName以及如何使用自定义类加载器停止运行。我的更新代码如下:
import com.mysql.jdbc.Driver;
public void insertIntoMysql() {
try {
addClassPath("/lib/mysql-connector-java-5.0.8-bin.jar");
// printing out the classpath URLs here shows several
// jar files along with the one I just added:
// file:/C:/myProjectDir/lib/mysql-connector-java-5.0.8-bin.jar
// connect to mysql
String myUrl = "jdbc:mysql://localhost:3306/myDB";
Connection conn = DriverManager.getConnection(myUrl, "root", "adminpw");
...
} catch {
...
}
}
但是,即使我的类路径已更新,我仍然会得到与最初得到的相同的SQLException。
我还尝试在添加新的类路径后立即调用BeanShell的“ reloadClasses()”方法,但无济于事。
是的,这与用于加载类的自定义类加载器有关。Javadocs中也提到了这一点DriverManager
:
getConnection
调用该方法时,DriverManager
它将尝试从初始化时加载的驱动程序和使用与当前applet或应用程序相同的类加载器显式加载的驱动程序中找到合适的驱动程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句