Извлечение данных Sql Server (java jdbc): процесс зависает при получении строк - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно извлечь данные из базы данных удаленного сервера Sql. Я использую mssql jdbc драйвер . Я заметил, что часто при извлечении строк из базы данных процесс неожиданно зависает, не давая ошибок. Он просто застрял, и больше строк не обрабатывается.

Код для чтения из базы данных следующий:

String connectionUrl = "jdbc:sqlserver://10.10.10.28:1433;databaseName=MYDB;user=MYUSER;password=MYPWD;selectMethod=direct;sendStringParametersAsUnicode=false;responseBuffering=adaptive;";

String query = "SELECT * FROM MYTABLE";

try (Connection sourceConnection = DriverManager.getConnection(connectionUrl);
    Statement stmt = sourceConnection.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, SQLServerResultSet.CONCUR_READ_ONLY)   ) {

    stmt.setFetchSize(100); 
    resultSet = stmt.executeQuery(query);

    while (resultSet.next()) {

        // Often, after retrieving some rows, process remains stuck here

    }

}

Обычно соединение установлено правильно, некоторые строки выбираются, чем в какой-то момент процесс может застрять в получении следующего пакета строк, не давая ошибок и не обрабатывая новую строку. Это случается иногда, а иногда - успешно.

AFAIK, единственная причина, которую я вижу, состоит в том, что в какой-то момент возникает проблема соединения с удаленным компьютером, но не должен ли я быть уведомлен об этом от водителя?

Я не уверен, как мне следует обрабатывать ситуации такого типа ... могу ли я что-то сделать на моей стороне, чтобы процесс завершился, даже если возникла временная проблема с удаленным сервером (конечно, если соединение не подлежит восстановлению, я ничего не могу сделать)?

В качестве другого теста вместо драйвера java jdbc я использовал утилиту bcp для извлечения данных из удаленной базы данных, и даже с этой встроенной утилитой я могу наблюдать ту же проблему: иногда она успешно завершается в других случаях он извлекает некоторые строки (скажем, 20000), а затем застревает, ошибок нет и строки не обрабатываются.

...