我们正在开发高度依赖flask-sqlalchemy
集成模块的Flask应用程序。 SQLAlchemy用于连接到我们的MonetDB数据库。
通过命令运行应用程序时
flask run
服务不定期,但通常挂在与数据库通信有关的各种奇怪的数据库客户端站点症状上,例如数据库连接关闭,无法解码某些字符,以及其他难以解释的错误。
我知道默认情况下,Flask的Werkzeug开发服务器启用了线程,并且当我们运行不带线程的开发服务器时
flask run --disable-threads
这项服务就像一个魅力一样,没有任何错误。
扫描我们的代码库,我认为我们正在以一种直接的方式配置和使用flask-sqlalchemy
:
app = Flask(__name__)
app.config.from_object(config[environment])
db.init_app(app)
我们使用通常看起来像是的调用将更新传播到数据库。
...
db.create_all()
db.session.add(foo)
db.session.add(bar)
...
db.session.commit()
据我所知SqlAlchemy
db
对象的会话成员是ScopedSession
实例,因此它应该是线程本地的,因此是线程安全的对象。但是,尽管如此,我们还是遇到了上述错误。
我唯一可以想象的是,有时数据库修改并不总是直接跟在db.session.commit()之后,即我们忘记调用session.commit()了。但是我不知道这将如何导致这些多线程问题。