雪花 JDBC 驱动程序内部错误:无法检索第一个箭头块的行数:null - 仅发生在 SELECT 语句上

Posted

技术标签:

【中文标题】雪花 JDBC 驱动程序内部错误:无法检索第一个箭头块的行数:null - 仅发生在 SELECT 语句上【英文标题】:Snowflake JDBC driver internal error: Fail to retrieve row count for first arrow chunk: null -- only occurs on SELECT statements 【发布时间】:2021-07-28 06:27:03 【问题描述】:

我已经成功建立了JDBC连接,可以成功执行“使用仓库...”之类的语句。当我尝试运行任何 SELECT 语句时,我收到以下错误:

net.snowflake.client.jdbc.SnowflakeSQLLoggedException:JDBC 驱动程序内部错误:无法检索第一个箭头块的行数:null。

我可以看到我的请求成功,并在雪花 UI 中返回了预期的数据。

错误发生在这一行: rs = statement.executeQuery("select TOP 1 EVENT_ID from snowflake.account_usage.login_history");

该语句能够在此行之前执行查询,并且结果集符合预期。任何见解将不胜感激!

【问题讨论】:

只有那个查询失败?表中的其他选择呢? 【参考方案1】:

这可能有几个原因:

    您使用的是什么 JDK 版本? JDK16 引入了对 JDK 内部的强封装(参见JEP 396) 如果您使用的是 JDK16,请尝试在启动时在 JVM 级别设置:

    -Djdk.module.illegalAccess=permit

这是一种解决方法,直到我们解决了以下 Apache Arrow 问题 ARROW-12747

    如果您使用使用 JDBC 连接到 Snowflake 的应用程序,则该应用程序可能无法正确解释结果。尝试切换回 JSON 而不是 ARROW 格式,看看是否可以修复它。这可以通过运行在会话级别完成:

    ALTER SESSION SET JDBC_QUERY_RESULT_FORMAT='JSON'

【讨论】:

嗨,你能解释一下-Djdk.module.illegalAccess=permit 的作用吗?我在 Arch linux 的 dbeaver 中遇到了同样的问题,java 16 openjdk 连接到雪花。如果您可以解释更多关于选项 1 的信息,以及 JDKs above 11 might cause unexpected behavior 的含义,这将使这个答案更加完整和有用。 @scientific_explorer 我已经编辑了答案,谢谢指出。 @sergiu 谢谢你的回答。但是,对于我们这些使用 R 的雪花驱动程序的人来说,这有点问题,因为我们无法在启动时指定 jvm 级别或更改会话,这意味着我们必须在系统范围内降级我们的 jvm 版本才能获得连接。我们是否希望在箭头兼容性问题上尽快取得进展? @Bob 箭头问题已直接向 Apache 开放,因此我们正在等待他们的反馈。【参考方案2】:

我遇到了同样的问题,并且能够通过降级到 Java 11 版本来使其正常工作

[net.snowflake/snowflake-jdbc "3.13.8"]

【讨论】:

我也遇到了同样的问题。只有我将 R 连接到雪花。我已经尝试过您的解决方案(将 Java 降级到 11.0.13 和 Snowflake .jar3.13.8。我能够运行 dbListTables(con) 并看到一个表列表但是在运行查询时,例如 dbGetQuery(con, "select * from table limit 10") 我得到了下面的错误 Note: method with signature ‘DBIConnection#character’ chosen for function ‘dbListFields’, target signature ‘JDBCConnection#character’. "JDBCConnection#ANY" would also be valid Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set", : Unable to retrieve JDBC result set JDBC ERROR: SQL compilation error: Object '"dwh_db.visitor.table"' does not exist or not authorized. Statement: SELECT * FROM "dwh_db.visitor.table" LIMIT 0 使用JavaSnowflake 的.jar 文件link 的特定版本组合解决

以上是关于雪花 JDBC 驱动程序内部错误:无法检索第一个箭头块的行数:null - 仅发生在 SELECT 语句上的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 DBEAVER 连接到雪花超时

雪花 jdbc 中的 secretkeyfactory 不可用错误

为啥雪花 jdbc 会抛出 [XX000][200001] 错误

Flyway 无法使用 Snowflake JDBC

通过 JDBC 与 COPY_INTO + GET 批量卸载雪花数据

使用雪花 JDBC 驱动程序自定义接收器到雪花非常慢