Долгое время открытое соединение с базой данных и память запросов SQL-соединений

0

В настоящее время я работаю над java-приложением, которое выполняет следующее в фоновом потоке.

  1. открывает соединение с базой данных
  2. Выберите несколько строк (100000+)
  3. выполните долговременную задачу для каждой строки, вызвав ResultSet.next() с некоторым размером буфера, определяемым resultSet.setFetchSize()
  4. наконец, после того, как все завершится, соединение

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

(В контексте как MySQL, так и Oracle)

Теги:
jdbc

2 ответа

1

этот механизм кажется не очень хорошим.

хотя оба mysql (движок innodb) и оракул обеспечивают последовательное чтение для выбора,

такой длинный выбор может привести к снижению производительности за счет сборки блока cr и других работ,

даже ora-01555 в оракуле.

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

затем обрабатывать фактический бизнес один за другим.

наконец, запрос всех данных сначала не уменьшит использование памяти,

но сокращают время континуума для сегмента памяти и временного сортировки темпа.

или вы решили разобрать всю работу на мелкие кусочки,

это лучше.

1

С точки зрения Oracle, открытие курсора и выборка из него периодически не имеют такой большой отдачи, если он остался открытым... если только базовые данные, которые курсор не запрашивает от изменений, начиная с первого запроса.

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

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

Что касается использования памяти, курсор не открывает набор результатов и не сохраняет его где-то для вас; это просто набор инструкций для базы данных о том, как получить следующую строку, которая выполняется, когда вы делаете выборку. То, что хранится в памяти, - это набор инструкций, который относительно невелик по сравнению с количеством данных, которое он может вернуть!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню