[Snowflake-jdbc]从连接的resetset对象获取信息时挂起。getMetadata()。getColumns(…)

问题描述 投票:0回答:2

我尝试使用以下代码测试雪花的jdbc连接

                Connection conn = .......
                .......
                ResultSet rs = conn.getMetaData().getColumns(**null**, "PUBLIC", "TAB1", null); // 1. set parameters to get metadata of table TAB1

                while (rs.next()) {   // 2. It hangs here if the first parameter is null in above liune; otherwise(set the corrent db name), it works fine
                    System.out.println( "precision:" + rs.getInt(7)
                                       + ",col type name:" + rs.getString(6)
                                       + ",col type:" + rs.getInt(5)
                                       + ",col name:" + rs.getString(4)
                                       + ",CHAR_OCTET_LENGTH:" + rs.getInt(16)
                                       + ",buf LENGTH:" + rs.getString(8)
                                       + ",SCALE:" + rs.getInt(9));
                }
                .......

我在Intellij IDEA中调试了上面的代码,发现调试器无法获取对象的详细信息,它始终显示“正在评估...”

我使用的JDBC驱动程序是snowlight-jdbc-3.12.5.jar

是错误吗?

jdbc snowflake-cloud-data-platform
2个回答
0
投票

当catalog(数据库)自变量为空时,可以在Snowflake帐户的JDBC code effectively runs the following SQL UI /视图中验证Query History

show columns in account;

这是运行昂贵的元数据查询,因为没有过滤器并且请求的宽度很广(整个帐户的列)。

根据组织帐户中存在的数据库数量,可能需要执行几分钟或一小时才能返回结果,这似乎是“挂起”的原因。在一个简单的测试中,将大约50k +个表分散在100多个数据库和模式中,这至少花了15分钟才能返回结果。

我在Intellij IDEA中调试了上面的代码,发现调试器无法获取对象的详细信息,它始终显示“正在评估...”

这可能对您的IDE来说很奇怪,但是在紧要关头,您可以使用Dump Threads (Ctrl + Escape, or Ctrl + Break) option in IDEA提供一个捕获的线程转储视图。这应该有助于表明JDBC客户端线程没有挂起(例如,它没有锁定或没有饥饿),它只是在服务器上等待发送回结果。


0
投票

3.1.5 jar没有问题。我刚刚在Eclipse中测试了相同版本,可以检查所有对象。您的IDE可能有问题。


ResultSet columns = metaData.getColumns(null, null, "TESTTABLE123",null);

            while (columns.next()){
                 System.out.print("Column name and size: "+columns.getString("COLUMN_NAME"));
                 System.out.print("("+columns.getInt("COLUMN_SIZE")+")");
                 System.out.println(" ");
                 System.out.println("COLUMN_DEF : "+columns.getString("COLUMN_DEF"));
                 System.out.println("Ordinal position: "+columns.getInt("ORDINAL_POSITION"));
                 System.out.println("Catalog: "+columns.getString("TABLE_CAT"));
                 System.out.println("Data type (integer value): "+columns.getInt("DATA_TYPE"));
                 System.out.println("Data type name: "+columns.getString("TYPE_NAME"));
                 System.out.println(" ");
              }

© www.soinside.com 2019 - 2024. All rights reserved.