@wideShift

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

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

И еще вопрос: почему если закрыть курсор после соединения, то ошибки не возникает(курсор же использует соединение)? Не логично же, почему при закрытии соединения автоматически курсор не закрывается?
conn.commit()
conn.close()
cursor.close()
  • Вопрос задан
  • 1861 просмотр
Решения вопроса 1
@Stormx480
Python Backend Developer
Это называется устойчивой хорошей практикой, которая позволяет в будущем избежать большого кол-ва ошибок.

Для начала надо определится с терминологией:

cursor - Класс драйвера, через который происходит взаимодействие с базой данных.
connection - Класс подключения к базе данных.

У любой базы данных есть максимально допустимое кол-во подключений. Как и максимально допустимое кол-во открытых курсоров.

Если не закрывать - вы рано или поздно упретесь в лимит.

Так же, следует помнить, что транзакция начинается до выполнения запроса, и при определенных настройках бд, на момент выполнения транзакции таблицы лочатся, и не дают другим потокам или программам ими воспользоваться. По умолчанию транзакция создаётся до выполнения первого запроса к БД, и все последующие запросы выполняются в контексте этой транзакции. А длительные транзакции ни к чему хорошему не приводят.

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

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

Если вы не хотите постоянно закрывать подключение и курсоры - вы можете оформить код через конструкцию with. Тогда подключение и курсор будут закрывать автоматически, после выполнения блока кода в конструкции.

Как итог:

1) Закрытие позволяет избежать ошибок, связанных с использование одних подключений в разных потоках.
2) Не расстрачивает вашу оперативную память для создания ненужных подключений.
3) Не забивает базу ненужными подключениями.
4) Позволяет правильно распоряжаться транзакциями, и делать в определенной транзакции только определенные действия, а не пихать все в кучу.
5) Вы не упираетесь в лимит подключений и не получаете ненужных об этом ошибок.
6) Вы не получаете ошибок о том, что одно подключение пытается взаимодействовать с таблицей или данными, созданными в другом подключении, и залоченными или не расшаренными на данный момент.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы