Время жизни соединения SQL

Я работаю над API-интерфейсом для запроса к серверу базы данных (в моем случае Oracle) для получения огромного количества данных. (На самом деле это слой поверх JDBC.)

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

Но мне интересно, является ли это лучшей практикой, поскольку у нее есть некоторые проблемы:

  • Набор результатов сохраняется в течение всей обработки. Если обработка длится столько же, сколько и получение данных, это означает, что мой набор результатов будет открыт в два раза дольше
  • Выполнение другого запроса в моем цикле обработки означает открытие другого результирующего набора, пока я его уже использую, возможно, не стоит начинать открывать слишком много результирующих наборов одновременно.

С другой стороны, у него есть некоторые преимущества:

  • У меня никогда не бывает более одной строки данных в памяти для набора результатов, так как мои запросы имеют тенденцию возвращать около 100 тыс. Строк, это может стоить того.
  • Поскольку моя структура в значительной степени основана на концепциях функционального программирования, я никогда не полагаюсь на то, что несколько строк находятся в памяти одновременно.
  • Запуск обработки первых возвращенных строк, пока ядро ​​базы данных все еще возвращает другие строки, является значительным приростом производительности.

В ответ на Гэндальфа я добавлю еще немного информации:

  • Мне всегда придется обрабатывать весь набор результатов
  • Я не делаю агрегацию строк

Я интегрируюсь с приложением для управления основными данными и извлекаю данные для того, чтобы либо проверить их, либо экспортировать их в различных форматах (в ERP, на веб-платформу и т. Д.).

1 ответ

Решение

Универсального ответа нет. Я лично реализовывал оба решения десятки раз.

Это зависит от того, что для вас важнее: память или сетевой трафик.

Если у вас быстрое сетевое соединение (LAN) и плохой клиентский компьютер, затем извлекайте данные построчно с сервера.

Если вы работаете над Internet Тогда вам поможет пакетная загрузка.

Вы можете установить количество предварительных выборок или свойства слоя базы данных и найти золотое сечение.

Правило большого пальца таково: извлекайте все, что можете, не замечая этого

если вам нужен более подробный анализ, то здесь есть шесть факторов:

  • Время отклика генерации строк (как скоро Oracle генерирует первый ряд / последний ряд)
  • Время отклика доставки строки / скорость (как скоро вы можете получить первый ряд / последний ряд)
  • Время отклика обработки строки / скорость (как скоро вы можете показать первую строку / последнюю строку)

Одним из них будет узкое место.

Как правило, rate а также responce time являются антагонистами.

С помощью предварительной выборки вы можете контролировать время отклика доставки строки и скорость доставки строки: чем выше число предварительных выборок, тем выше скорость, но уменьшается время отклика, а меньшее количество предварительных выборок будет противоположным.

Выберите, какой из них важнее для вас.

Вы также можете сделать следующее: создать отдельные потоки для извлечения и обработки.

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

Он будет извлекать строки в фоновом режиме, и вы можете обрабатывать их также в фоновом режиме, пока пользователь просматривает первые строки.

Другие вопросы по тегам