Flask和mysql多线程_数据库连接池Flask-SQLAlchemy中多线程安全的问题
使用flask-sqlalchemy写代码码到一半,突然想到,Session是否是线程安全的?于是上官方文档,答案是否!
那问题来了,怎么破?因为它会牵涉到多线程情况下,调用rollback导致的不可预期影响。
官网给了两个方案:
使用 Contextual/Thread-local Sessions
不用全局的,而是采用函数间传递的session变量
明显,第一种方式对现在代码的改动最小,扩展性也更好。因为使用的flask-sqlalchemy,于是参考在线文档 ,发现table的定义与flask-sqlalchemy quickstart的定义不一致。文档里面有一句有趣的话
a preconfigured scoped session called session
那是否意味着 flask-sqlalchemy 对 sqlachemy 封装之后,将session做了多线程支持的封装?看源码!
classSQLAlchemy(object):
def __init__(self, app=None, use_native_unicode=True, session_options=None, metadata=None):
if session_options isNone:
session_options ={}
session_options.setdefault('scopefunc', connection_stack.__ident_func__)
self.use_native_unicode =use_native_unicode
self.session =self.create_scoped_session(session_options)
self.Model =self.make_declarative_base(metadata)
self.Query =BaseQuery
self._engine_lock =Lock()
self.app =app
_include_sqlalchemy(self)
if app is notNone:
self.init_app(app)
self.session = self.create_scoped_session(session_options)
从这个变量赋值来看,就是scoped_session,为以防万一,再跟进去看
def create_scoped_session(self, options=None):
"""Helper factory method that creates a scoped session. It
internally calls :meth:`create_session`.
"""
if options isNone:
options ={}
scopefunc = options.pop('scopefunc', None)
returnorm.scoped_session(partial(self.create_session, options),
scopefunc=scopefunc)
把这个代码与sqlalchemy的官方scope_session例子对比
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
session_factory = sessionmaker(bind=some_engine)
Session = scoped_session(session_factory)
完全一致!
所以,db.session是线程安全的,并且对sqlalchemy做了非常好的封装,便捷性更上一层楼,放心用吧!
Flask和mysql多线程_数据库连接池Flask-SQLAlchemy中多线程安全的问题相关推荐
- jndi mysql数据库_数据库连接池技术中dbcp、c3p0、jndi
数据库连接池技术中dbcp.c3p0.jndi 发布时间:2020-05-26 08:52:33 来源:51CTO 阅读:371 作者:ikilun 不管通过何种持久化技术,都必须通过数据连接访问数据 ...
- 【Python SQLAlchemy】数据库连接池SQLAlchemy中多线程安全的问题
问题描述 写了一个apscheduler定时任务 里面用到SQLAlchemy在同一时间点开启了18个任务,用于更新18个表 但是最终看数据库表的时候,发现有2个表未更新.查看打印日志均正常,查找原因 ...
- mysql事务锁导致tomcat崩溃_数据库连接池连接耗尽,导致tomcat请求无响应,呈现出假死状态...
最困难的事情就是认识自己! 个人网站 ,欢迎访问! 前言:最近,测试部门的同事找到我,说他们测试时,没一会就发现服务接口请求一直无响应,Tomcat跟死掉了一样,也没有返回任何的错误响应,说让我赶紧排 ...
- gc问题mysql连接池_数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决...
问题现象 在某个工作日,突然收到线上的服务告警,有大量的请求延时产生,查看线上服务发现基本上都是获取数据库连接超时,而且影响时间只有3~4秒钟,服务又恢复了正常.隔了几分钟之后,又出现了大量的告警,还 ...
- druid mysql 配置优化_数据库连接池优化配置(druid,dbcp,c3p0)
考虑因素 1:当前连接DB的规模 2:并发情况 3:执行db的响应时间 配置考虑 1:初始化连接:可考虑设置为3个连接 .对于db规模特别大的情况下可考虑设置为1个.避免启动时间过长: 2:最小连 ...
- mysql dbcp 配置文件_数据库连接池DBCP使用方式
数据库连接池DBCP使用方式 概念 开源数据源实现,使用这些数据库连接池后,我们在项目开发中就不需要编写连接数据库的代码了. 开源数据源包含DBCP.C3P0.Druid等 DBCP Java使用实例 ...
- mysql连接池和最大连接数_数据库连接池和mysql的最大连接数的区别
什么叫做数据库连接池 连接池的作用是什么? 数据库连接池,简称dbcp database connection pool 存在意义: 数据库的连接是非常耗费系统资源的,一个应用通常都是需要与数据库打交 ...
- c mysql 关闭连接池_数据库连接池关闭的时间
上一篇说到分析关闭连接与不关闭连接的性能,到后来我发现自己得出的结论有误.经过多次测试发现关闭连接和不关闭连接耗费的时间基本一样.进哥也说了这是有连接池的原因.其实,自己以前对Ado.net了解的不深 ...
- c3p0 mysql 连接池配置文件_数据库连接池c3p0的使用
原标题:数据库连接池c3p0的使用 来源:java联盟 https://mp.weixin.qq.com/s/5Tbkf8dVFfH8AvtqWl-7Xg 程序员共读整理发布,转载请联系作者获得授权 ...
最新文章
- jquery倒计时插件可自定义多个倒计时间
- [译]JavaScript中,{}+{}等于多少?
- C#.NET学习笔记---C#中的条件编译
- 解决Ubuntu中sublime无法输入中文的问题
- Visual Studio2019 应用程序无法正常启动0xc000007b
- Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)
- Linux操作系统下软件的安装方法大全
- python工具包_python 工具包
- c#erp项目源码 mysql_Jsp+Ssm+Mysql实现图书馆预约占座管理系统项目源码(可带论文文档)...
- 深入理解C#:编程技巧总结(一)
- 设置IIS会话过期时间
- SpringBoot使用Mina框架进行服务端与客户端数据通信
- 深入理解傅里叶变换的性质:实函数、卷积、相关、功率谱、频响函数
- app 服务器 运营 维护,app服务器维护
- 好用的码字软件,年入百万的大神作家们都在用
- [含lw+源码等]微信小程序在线考试管理系统+后台管理系统[包运行成功]
- 修改Android系统配置文件build.prop
- SVN版本库备份和恢复
- 安卓zip解压软件_纯C语言编写的开源免费解压压缩软件——拥有极致性能的 7-zip...
- 如何用python查看pyc文件_如何理解.pyc文件内容
热门文章
- BUG! exception in phase semantic analysis in source unit
- SAP Spartacus自定义Component的Not found问题
- SAP Spartacus的Component 请求
- 如何创建依赖于某时间段的ABAP视图
- Groovy里的setProperty和getProperty重载用法
- ABAP内表在ABAP 740后支持的filter操作
- Why Opportunity uses US as local instead of ZH - language determination in
- Reuse library debug in Chrome - phase3 exchange drop down list
- SAP Marketing Cloud功能简述(四) : 线索和客户管理
- How is ABAP keyword highlight implemented in Chrome