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