【问题标题】:JDBC Driver isn't loading properly in JavaJDBC 驱动程序未在 Java 中正确加载
【发布时间】:2015-03-25 19:50:25
【问题描述】:

每当我运行以下代码时:

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

【问题讨论】:

  • “/myProjectDir/lib/mysql-connector-java-5.0.8-bin.jar”是jar的绝对路径吗?
  • 是的。我知道这很糟糕,但是当我开始工作时我会担心清理它。
  • 为什么需要使用自定义类加载器?您可以删除该行并调用 Class.forName("com.mysql.jdbc.Driver") 吗?
  • @exxodus7 让它工作的唯一方法就是清理它。
  • @exxodus7 我的意思和你所说的“清理它”完全一样。你是介绍这个词的人。事实是您将不得不将 JAR 文件添加到应用程序的 CLASSPATH 中,这不需要更改调用此方法的代码,然后您可以删除 Class.forName() 调用,这还没有从 2007 年开始需要。

标签: java mysql jdbc beanshell


【解决方案1】:

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

当调用getConnection 方法时,DriverManager 将尝试从初始化时加载的驱动程序和使用与当前小程序或应用程序相同的类加载器显式加载的驱动程序中找到合适的驱动程序.

【讨论】:

  • 嗯,所以我无法更改调用代码(因此,我猜是主类加载器),那么 DriverManager 将永远无法工作?这向我解释了为什么我的代码不起作用(谢谢!)但是有解决方案吗?
  • @exxodus7 你能否在你的问题中解释更多关于你是如何运行这个的?为什么需要使用自定义类加载器?
  • @exxodus7 您必须更改调用代码。它不起作用。它从来没有奏效。它永远不会起作用。一文不值。
  • @manouti 我正在一个脚本中执行此操作,该脚本由我无权访问的软件调用,因此无法更改脚本的调用方式。
  • @manouti 如果我删除自定义类加载器的使用,驱动程序的 jar 文件永远不会加载,并且 forName 行会抛出 ClassNotFoundException。
【解决方案2】:

jar 文件应该在您的类路径

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多