uWSGI 和 SQLAlchemy 一起使用的注意事项
2024-10-08 13:01:39
最近在使用 Flask 中使用 SQLAlchemy 开发程序,一开始好好的,然后使用 uWSGI 部署到线上后,出现了各种 mysql 客户端的问题,如:
(_mysql_exceptions.ProgrammingError) (2014, "Commands out of sync; you can't run this command now") NoSuchColumnError: "Could not locate column in row for column 'user_token.uid'"
等等。
直觉告诉我,一定是多线程引起的问题。但 flask 在使用 sqlalchemy 时,已经使用 scoped_session 包装了数据库的连接,使每个线程独立创建一个数据库连接,应该没有并发问题(参考:http://blog.csdn.net/yueguanghaidao/article/details/40016235)
于是就想是不是 uWSGI 本身的机制导致,然后看到此篇文章,才豁然开朗。http://mattharris.org/2015/10/fixing-sqlalchemy-mysql-errors-on-restart-of-uwsgi/
主要问题是说,uWSGI 启动 app 时,先在一个父进程中启动,然后 fork 出几个子线程。所以数据库连接也被 fork 出来了,于是出现了并发问题。在子线程中,出现问题后,会重新连接数据库,于是服务器又恢复健康状态了。
解决方法是,在 uWSGI 启动时增加 lazy-apps = true 属性,需要注意的是,这样会消耗较多的内存,因为子线程不是被 fork 出来的。
【百度了很久都没有结果,然后花钱买了vpn,google一下立马找到解决方案】
最新文章
- NOI 4976:硬币
- HTML5-布局的使用
- 【URAL 1018】Binary Apple Tree
- 用hashMAP或ArrayList解决recylerView中checkbox的选择错乱问题。
- linux C学习笔记01--makefile
- Linux及安全——ELF实践
- Delphi 的绘图功能[1] - PolyBezier、PolyBezierTo
- Android SDK的docs访问速度很慢(新)
- C难点分析
- c++ 时间格式化
- ubuntu15.10升级时校验和不符的解决方法
- MFC动态创建按钮,并在按钮上实现位图的切换显示
- Python内置函数str()和repr()
- Linux用户相关的操作命令
- Python自学笔记-进程,线程(Mr serven)
- 不同版本的Chrom浏览器对应的ChromDriver的版本
- Codeforces Round #494 (Div. 3) D. Coins and Queries(贪心
- Java控制台常用命令
- Shell案例:图案打印
- Noip前的大抱佛脚----数论