Pony ORM автор Александр Козловский @metaprogrammer ответил на это в Официальном чате Pony ORM Telegram .
Цель db_session - управлять тремя вещами:
Подключение к базе данных
Пони связывает отдельное соединение с каждым потоком. Если процесс не использует потоки, будет использоваться только одно соединение. Когда db_session заканчивается, он возвращает свое соединение с пулом соединений. Это означает, что соединение остается открытым и сохраняется для будущего использования. Далее db_session будет использовать то же соединение. Таким образом, в отношении использования соединения нет разницы между одной db_session и несколькими последовательными db_sessions
Состояние транзакции
Когда db_session заканчивается, он выполняет неявную фиксацию. Нет никакой разницы между неявной и явной фиксацией, поэтому, если у вас есть одна db_session с ручным вызовом commit (), то это то же самое, что и несколько последовательных db_sessions. Однако, если вы не используете явный commit (), то long db_session может удерживать блокировку базы данных и мешать другим процессам работать с базой данных или конкретной таблицей, пока не будет выполнена фиксация
Кэш в памяти загруженных объектов
Основное различие между одним db_session и несколькими последовательными db_sessions заключается в управлении кэшем в памяти объектов, загружаемых из базы данных. Каждая db_session имеет отдельный кеш. Объекты внутри кеша сшиты отношениями. Если вы загружаете кучу объектов курса, студента и группы, они все связаны друг с другом через атрибуты отношений. Из-за этого невозможно выгрузить некоторые объекты из кэша и сохранить остальные. Сборщик мусора не может собирать только некоторые объекты из кэша, потому что все они указывают друг на друга с помощью циклических ссылок. Таким образом, кэш может быть удален только целиком, когда db_session закончен.
Итак, если у вас есть одна давняя db_session, она не освободит память до конца. Но несколько меньшему db_session может потребоваться загрузить один и тот же объект из базы данных несколько раз. Таким образом, существует компромисс между памятью и производительностью
P.S. Даже если db_session завершена, соединение все равно будет удерживаться до завершения программы или явного вызова db.disconnect (). Pony неявно закрывает соединение, только если какое-то исключение из базы данных внутри db_session приводит к откату.