Я использую SqlAlchemy с sqlite3, использую по умолчанию NullPool и сессии с областью действия. Когда мое веб-приложение работает долгое время, в конечном итоге я получаю ошибку «слишком много файлов открыто», и приложение вылетает.
Я проследил это до многих файловых дескрипторов, открытых в моей базе данных sqlite3. Я включил регистрацию в NullPool, и я вижу, что некоторые сеансы не возвращаются в пул и не удаляются, хотя большинство из них. (NullPool должен создавать новый сеанс и возвращать его каждый раз.)
Кажется, что когда я делаю явный запрос, все в порядке - соединение БД создается и уничтожается после использования. Но в одном случае у меня есть метод в модели, который использует поля модели, и всякий раз, когда я вызываю этот метод, создается впечатление, что он создает новое соединение БД и никогда не освобождает его.
class Client(SurrogatePK, Model):
# ... more stuff ...
def unique_name(self):
"""Return a unique name for this client."""
return f'{self.location.name}.{self.name}'
Я понимаю, что у экземпляра модели есть связанный сеанс (тот, с которым он был создан?), Но я не понимаю, почему этот метод будет создавать новое соединение с БД и никогда не освобождать его.