[Snowflake-jdbc] Зависание при получении информации из объекта resetset в connection.getMetadata (). GetColumns (...) - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь протестировать jdb c соединение снежинки с кодами ниже

                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 и обнаруживаю, что отладчик не может получить подробную информацию об объекте , всегда отображается «Evaluating ...»

Драйвер JDB C, который я использовал, - это snowflake-jdb c -3.12.5.jar

Это ошибка?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Нет проблем с jar 3.12.5. Я только что протестировал ту же версию в 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(" ");
              }

0 голосов
/ 28 мая 2020

Когда аргумент каталога (базы данных) имеет значение NULL, код JDB C эффективно запускает следующий SQL, который вы можете проверить в пользовательском интерфейсе истории запросов своей учетной записи Snowflake. / Views:

show columns in account;

Это дорогостоящий запрос метаданных для выполнения из-за отсутствия фильтров и широкой запрашиваемой ширины (столбцы по всей учетной записи).

В зависимости от того, сколько баз данных существует в учетной записи вашей организации, для возврата результатов может потребоваться от нескольких минут до часа выполнения, что объясняет кажущееся «зависание». В простом тесте с более чем 50 тыс. Таблиц, распределенных по более чем 100 базам данных и схемам, для возврата результатов потребовалось не менее 15 минут.

Я отлаживаю приведенные выше коды в Intellij IDEA и обнаруживаю, что отладчик не может получить подробную информацию об объекте, он всегда показывает «Evaluating ...»

Это может быть странно с вашей IDE, но в крайнем случае вы можете использовать Dump Threads (Ctrl + Escape, or Ctrl + Break) в IDEA для предоставления единого захваченного представления дампа потока. Это должно помочь показать, что поток клиента JDB C не зависает (например, он не заблокирован или не истощен), он только ожидает, пока сервер отправит результаты.

...