Если ResultSet должен оставаться открытым в пакетной обработке, чтобы избежать нескольких запросов выборки - PullRequest
1 голос
/ 10 июля 2019

Я извлекаю записи (из большого набора данных, около 1 миллиона записей) из MariaDB партиями размером 500 (используя «лимит»).Для каждой итерации выборки я открываю и закрываю соединение.

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

Является ли второй способ правильным способом?

Редактировать: После того, как я получаю записи партиями размером 500, я обновляю поле для каждой записи и помещаю его в очередь сообщений.

Ответы [ 3 ]

0 голосов
/ 10 июля 2019

Да, второй способ - правильный способ сделать это.Вот несколько причин:

  • Существует много затрат на многократное выполнение запроса.
  • Базовые данные могут измениться в таблицах, которые вы используете, и отдельные пакеты могут быть несовместимыми.
  • Вы зависите от порядка результатов, и сортировка может иметь дубликаты.
0 голосов
/ 10 июля 2019
Your program starts
    Connect to database
        do some SQL (selects/inserts/whatever)
        do some more SQL (selects/inserts/whatever)
        do some more SQL (selects/inserts/whatever)
        ...
    Disconnect from database
Your program ends

То есть, держать соединение открытым столько времени, сколько необходимо во время выполнения программы. (Даже если вы не отключите явно, прекращение вашей программы приведет к завершению. Это важно отметить при работе с веб-сайтом - каждая «страница» по сути является отдельной «программой»; соединение БД не может быть удержано. между страницами.)

У вас есть еще один подразумеваемый вопрос ... "Должен ли я сразу получить пакет строк, а затем обработать их в клиенте?" Ответ "Это зависит".

  • Если обработка может быть выполнена в SQL, , вероятно, гораздо эффективнее делать это там. Пример: суммирование некоторых чисел.
  • Если вы извлекаете несколько строк из одной таблицы, то для каждой из этих строк извлекайте строки из другой таблицы ... Будет гораздо эффективнее использовать SQL JOIN.
  • «Дозировка» может быть неактуальной. Интерфейс клиента, вероятно,

    Fetch rows from a table (possibly all rows, even if millions)
    Look at each row in turn.
    

Пожалуйста, укажите особенности того, что вы будете делать с миллионами строк, чтобы мы могли обсудить более конкретно.

Цикл опроса:

Если вы проверяете, что нужно делать, только раз в минуту, переподключайтесь каждый раз.

Учитывая это, нет смысла зависать в наборе результатов между пулами.

0 голосов
/ 10 июля 2019

Открытие и закрытие соединения с базой данных занимает довольно много времени.Сохранение открытого соединения сэкономит много времени.

...