@Maxutka00

Зачем надо закрывать курсор при работе с БД?

Зачем закрывать курсор если я закрываю соединение к БД? MySql, Python

Закрывается ли курсор автоматом при закрытии соединения?

conn.close()
cursor.close()
  • Вопрос задан
  • 1132 просмотра
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
Дело в том что курсор может потреблять ресурсы. Например вы захотели взять первые 10 строк из 10000000 выборки но предварительно отсортировали. Выбрали 10 строк и не сделали финализирующие протокольные действия в Python. База данных будет удерживать в памяти алгоритмы и структуры данных для снапшота результата этого запроса до тех пор пока не придет явный CLOSE с вашей стороны либо интеллекуальный драйвер который еще и обладает логикой уборки мусора сам не догадается что Statement уже вышел из scope вашего использования и может быть удалён GC.

Я был свидетелем ситуации когда крупное ent-приложение Java/Oracle переполняло память из-за неверной обработки Exception и плодила много незакрытых курсоров в БД. Java от этого не сильно страдала (GC всё убирал) но страдал Oracle. Потому что уборка происходила слишком поздно. Пофиксилось тогда переписыванием с try на try-with-resources.

Поэтому если вы неряшливо обращаетесь с курсорами (явными и неявными (обычный select к примеру может прождать неявный курсор)) то не ваше приложение а база данных почувствует себя плохо. Как быстро и какие ошибки вы будете получать - зависит от настроек вашей БД.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Я полагаю, что закрывается.
Другое дело, что время жизни у курсора и соединения разное.
Курсор создаётся перед выполнением запроса (или цепочки запросов), и закрывается по их окончанию.
Это позволяет иметь несколько активных курсоров одновременно, используемых в разных подзадачах.
Соединение обычно создаётся в начале работы приложения, и закрывается в конце.
Если приложение содержит только одну подзадачу, тогда да, время жизни курсора и соединения совпадёт.
Ответ написан
AgentSmith
@AgentSmith
Это мой правильный ответ на твой вопрос
курсор сам по себе не закрывается. Его надо принудительно закрывать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы