1

以下 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.jarusing 'Script' | '将 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()部分似乎工作正常。如果我'脚本' | '清除脚本上下文'并在 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
4

1 回答 1

2

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

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

注意:使用 jdbc4 驱动程序应该注册自己,只是在类路径上

于 2015-06-13T06:25:21.073 回答