JDBC驱动程序未在Java中正确加载

时间:2015-03-25 19:50:26

标签: java mysql jdbc beanshell

每当我运行以下代码时:

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()”方法,但无济于事。

2 个答案:

答案 0 :(得分:2)

是的,这与用于加载类的自定义类加载器有关。在DriverManager的Javadocs中也提到了这一点:

  

当调用方法getConnection时,DriverManager将尝试从初始化时加载的那些驱动程序中找到合适的驱动程序,并使用相同的类加载器作为当前小程序或应用程序。

答案 1 :(得分:0)

jar文件应位于 classpath