gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:26:16 26 4
gpt4 key购买 nike

以下 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() 部分似乎工作正常。如果我“编写脚本” | “清除脚本上下文”并在 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

最佳答案

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

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

注意:对于 jdbc4,驱动程序应该通过在类路径上进行 self 注册

关于mysql - 为什么 DriverManager.getConnection() 查找在 GroovyConsole 中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30813196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com