Мы тестируем драйверы JDBC от jTDS и Microsoft, и мы страдаем от нежелательных пауз в выполнении запроса. Наше приложение открывает множество ResultSets и выбирает только несколько строк из каждого. Каждый запрос выбирает около 100 тыс. Строк, но мы выбираем только около 50 (этого достаточно для заполнения страницы). Проблема в том, что каждый запрос после первого содержит паузу около 2 с, когда драйвер загружает все строки из предыдущего ResultSet во временное хранилище (память или диск), чтобы их можно было просмотреть позже. Поскольку у нас около 6 запросов в худших сценариях, будет пауза около 10 с, что делает приложение невосприимчивым к пользователю. Версия MSSQL - 2005.
Чтобы удалить такие паузы, мы попытались включить MARS (множественные активные результирующие наборы) через параметры строки подключения драйвера JDBC Microsoft (из-за отсутствия документации мы перепробовали все, что перечислено в https://sites.google.com/site/sqlconnect/sql2005strings). Пример строки подключения:
JDBC: SQLServer: // TESTDBMACHINE; имя_экземпляр = S2005, Databasename = SampleDB; MarsConn = да
Но никто из них не решает проблему. Драйвер Microsoft JDBC, кажется, принимает что-либо в строке подключения - если вы замените MarsConn = yes на PleaseBeFast = yes, драйвер MS игнорирует параметр и даже не регистрирует факт. Я не знаю, является ли MARS клиентской функцией, которая просто кэширует строки из ранее активного набора результатов, или это серверная функция. Я даже не знаю, как определить на стороне сервера, использует ли данное соединение MARS. Если вы можете прокомментировать это, это будет приветствоваться.
Другим решением для паузы было использование прокручиваемых (двунаправленных) наборов результатов. Это удаляет паузу, но делает время выборки на 80% медленнее и потребляет больше ресурсов сети. Сейчас мы рассматриваем возможность реализации оболочки JDBC-соединений, которая поддерживает пул фактических соединений и автоматически выдает запросы к отдельным соединениям «ResultSet free». Но это несколько громоздко, потому что нам нужно сохранить связь между каждым соединением и его активным ResultSet. Кроме того, он потребляет больше соединений с сервера и может вызвать проблемы для администраторов баз данных. И это решение не помогает, если есть активная транзакция, для которой все запросы должны быть выполнены в одном соединении.
Знаете ли вы какой-либо параметр, конфигурацию, конкретный API, ссылку или трюк, которые могут убрать паузу во втором и последующих выполнениях запроса?