我正在使用sqlAlchemy和sqlite3,并使用默认的NullPool和作用域会话。当我的Web应用程序长时间运行时,最终出现“打开太多文件”错误,并且该应用程序崩溃了。 我已经跟踪到在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}'
我知道一个模型实例具有一个关联的会话(该会话是通过它创建的?),但是我不明白为什么这种方法会创建一个新的数据库连接而不发布它。