我尝试使用以下代码测试雪花的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
是错误吗?
当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客户端线程没有挂起(例如,它没有锁定或没有饥饿),它只是在服务器上等待发送回结果。
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(" ");
}