Время жизни соединения SQL - PullRequest
2 голосов
/ 27 мая 2009

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

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 28 мая 2009

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...