Зачем надо закрывать курсор при работе с БД?
Дело в том что курсор может потреблять ресурсы. Например вы захотели взять первые 10 строк из 10000000 выборки но предварительно отсортировали. Выбрали 10 строк и не сделали финализирующие протокольные действия в Python. База данных будет удерживать в памяти алгоритмы и структуры данных для снапшота результата этого запроса до тех пор пока не придет явный CLOSE с вашей стороны либо интеллекуальный драйвер который еще и обладает логикой уборки мусора сам не догадается что Statement уже вышел из scope вашего использования и может быть удалён GC.

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

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