【问题标题】:Why does DriverManager.getConnection() lookup fail in GroovyConsole?为什么在 GroovyConsole 中查找 DriverManager.getConnection() 失败?
【发布时间】:2015-08-29 01:28:27
【问题描述】:

以下 Groovy 脚本可以在命令行中正常工作。 (我成功获得了一个连接。)

// ---- jdbc_test.groovy
import java.sql.*
Class.forName("com.mysql.jdbc.Driver")
def con = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/test",
    "root",
    "password")
println con

> groovy -cp lib\mysql-connector-java-5.1.25-bin.jar script\jdbc_test.groovy
com.mysql.jdbc.JDBC4Connection@6025e1b6

但是,如果将相同的脚本加载到 GroovyConsole (2.4.3) 并运行 - 在使用“脚本”添加 mysql-connector-java-5.1.25-bin.jar 之后 | '将 Jar(s) 添加到 ClassPath' - 失败:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/test
at java_sql_DriverManager$getConnection.call(Unknown Source)
at jdbc_test.run(jdbc_test.groovy:3)

我添加到 GroovyConsole 中的类路径并尝试过的所有其他包或类都有效。 Groovy 的类加载和 DriverManager 的工作方式是否有一些意想不到的交互?

有没有办法解决这个问题?我正在尝试使用 GroovyConsole 以交互方式测试一些 JDBC 代码(一个函数库,每个函数都将 Connection 作为其第一个参数)。

更新:Class.forName() 部分似乎工作正常。如果我'脚本' | 'Clear Script Context' 并在 GroovyConsole 中重新运行脚本,我反而得到:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

如果我重新添加mysql-connector-java-5.1.25-bin.jar,我会返回获取:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/test

【问题讨论】:

    标签: mysql jdbc groovy groovy-console


    【解决方案1】:

    解决方案:驱动程序必须在类路径中。

    原因: 如果您查看 DriverManager 类,您会发现如下代码:Class.forName(driver.getClass().getName(), true, classLoader);。这是为了检查驱动程序是否可以从您的类加载器上下文中访问。该上下文是通过返回调用他 DriverManager 的类来确定的。此代码是为 Java 编写的,因此假定调用堆栈上有一定数量的帧要返回。由于 Groovy 不进行直接调用(除非您使用 @CompileStatic),这个数字是错误的,通常会导致选择 Groovy 核心类,从而导致选择 Groovy 主加载器......过去这通常是JDK系统类加载器因为反射。因此,即使驱动程序已加载并注册,您也无法访问它。

    注意:对于 jdbc4,驱动程序应该自己注册,只需位于类路径中即可

    【讨论】:

    • 谢谢。这很好地解释了它。使驱动程序 jar 文件可用于 GroovyConsole 的最简洁方法似乎是将其放入 {user.home}/.groovy/lib。这是 Groovy 的“conf/groovy-starter.conf”中包含的位置之一。
    • 感谢您的回答!我没有将驱动程序 jar 粘贴在类路径上,而是通过一个用 Java 编写的类代理对 DriverManager 的调用,这似乎也可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多