为什么在GroovyConsole中DriverManager.getConnection()查找失败?

时间:2015-06-12 22:42:36

标签: mysql jdbc groovy groovy-console

以下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)并运行 - 使用'Script'添加mysql-connector-java-5.1.25-bin.jar之后'将Jar添加到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

1 个答案:

答案 0 :(得分:2)

解决方案:驱动程序必须位于类路径上。

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

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