a3.sqlalchemy-scoped_session

SQLAlchemy会话管理:为什么你的session.close()可能不够用? 本文深入探讨了SQLAlchemy会话管理的核心机制,揭示了`session.close()`和`session.remove()`的使用场景与区别,帮助开发者避免内存泄漏和数据库连接耗尽问题。通过实际案例和最佳实践,提供了在Web应用和多线程环境中正确管理会话的解决方案。 阅读详情

scoped_session防止内存泄漏,保护性session的创建。

SQLAlchemy 的 scoped_session 是啥玩意

通常我们用 SQLAlchemy 写数据的时候要创建 Session 对象来维护数据库会话,用完了再关掉。但是听说还有个叫scoped_session的玩意,这是做啥用的?

这东西其实与 web 应用有一些关系。我们在使用 Django 的 ORM 的时候怎么没见到需要创建个 session 呢?因为它已经悄悄帮你实现好了维护 session 的逻辑,自动进行创建和销毁(多么伟大,多么 friendly 啊),而当我们用 Flask 之类裸奔极客模式的 web 框架时就没有这样的好事了,只能自己搞定。

Session 的生命周期

首先我们需要知道一个 sqlalchemy session 的生命周期是怎样的。我们的 web 应用会同时服务多个用户,因此不同的请求要有不同的 session,不然就会翻车。

session 会在一次请求进来的时候创建出来

session = Session()

在整个请求处理过程中被使用

session.add(some_obj)
session.commit()

在请求处理完毕后被关闭销毁。

session.close()

当然上面的代码只是简略的情形,通常还需要包括 try-except 来处理 session 需要 rollback 之类的情况。

scoped_session 与 registry 模式

scoped_session就是用在 web 应用这种处理请求的场景下,协助进行 session 维护的。

from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker

session_factory = sessionmaker(bind=some_engine)
ScopedSession = scoped_session(session_factory)

通常我们在初始化 web 应用时通过scoped_session函数对原始的Session工厂进行处理,返回出一个ScopedSession工厂,在每个请求来的时候就可以通过这个工厂获得一个 scoped_session 对象。

这实际上实现了一种 registry 模式,它有个中心化的 registry 来保存已经创建的 session,并在你调用ScopedSession工厂的时候,在 registry 里面找找是不是之前已经为你创建过 session 了,如果有,就直接把这个 session 返回给你,如果没有,就创建一个新的 session,并注册到 registry 中以便你下次来要的时候给你。

some_session = ScopedSession()
some_other_session = ScopedSession()
>>> some_session is some_other_session
True

>>> some_other_session.remove()

>>> new_session = ScopedSession()
>>> new_session is some_session
False

调用scoped_session的remove()方法会调用ScopedSession.close()关闭 session,释放连接资源、把数据库 transaction 状态恢复到初始状态等,最后销毁 session 本身,下回再调用ScopedSession的时候,又会重新创建一个 session 出来。

这样,我们在整个请求的任意环节,都可以开开心心地随时通过工厂来获取一个 “新的”session 对象,而只要在请求处理完的时候移除这个 session 就可以了。如果不用它,那么你在每个需要读写数据库的地方,都要小心翼翼地创建个 session 出来,并记得把它们关掉,不然就造成了资源泄漏。

Thread-Local Storage

上面说到 scoped_session 类似单例模式,我们看似创建了新的 session,实际上拿到的可能是之前创建出来的 session。但我们 web 应用通常要同时处理多个请求,我的请求有没有可能不小心拿到别人创建的 session 对象呢?

这是一个好问题,然而正直的 SQLAlchemy 不会让不法分子得逞的

尽管 Python 有着神奇的 GIL,没法真正的并行地跑线程,但至少还是有线程的概念的,对于不同的请求进来的时候我们通常会在不同的线程中进行处理。Python 里有个概念叫 thread local storage(TLS),即线程本地存储,它可以作为全局变量一样使用,但这个数据只在这个线程中有效,与其他的线程是隔离的。

import threading
mydata = threading.local()
mydata.x = 1

等等,全局变量?这不正好和刚才 registry 模式的思想差不多嘛。和我们所希望的一样,scoped_session 也确实使用了 tls 作为 session 的存储方式,一个线程只能拿到自己创建出来的 session,保证了不同线程不会乱入别人的 session。

使用 tls 还有另外一个好处,由于 session 是跟着线程走的,就算你没有调用remove()亲手干掉 session,也会由于线程结束,session 也跟着被一起回收掉,不至于泄漏。(但仍建议在必要的时候对资源进行显式的回收)

还有一个隐蔽的问题,如果我们用了 gevent 来处理并发而不是用多线程,会翻车吗?答案是不会。++gevent 在monkey.patch_all()的时候,已经悄悄把这个 threading 相关的东西悄悄替换成自己的一套了++,thread-local 的东西已经变成了 greenlet-local,不同协程间仍是隔离的,一般不会有问题。

要不要用 scoped_session

对于 Flask 框架,强烈不建议自己维护 session,就算我们已经有了 scoped_session,但这玩意仍旧不是那么好用,有很多细节需要处理。Flask 有个名为 Flask-SQLAlchemy 的扩展,它已经把 scoped_session 的这一套在内部帮你配置好了,你只需要正常使用它的db.session,无需关心 session 是怎么来的,又是怎么没的。

++但如果用了个别的框架,而它又没有好用的自带 ORM(即除了 Django 之外其他框架),或者是在非 web 应用里使用,这时就应该使用 SQLALchemy 的 scoped_session,来减少一些 bug 或者内存泄漏的可能++。

参考:

Contextual/Thread-local Sessions – SQLAlchemy Documentation

threading — Thread-based parallelism – Python Documentation

物理小白也能懂的PINN指南:用Python给神经网络注入‘物理常识‘ 本文为物理小白提供了一份通俗易懂的PINN入门指南。通过生活化类比和Python实战,详细讲解了如何将物理定律作为约束注入神经网络,使其具备“物理常识”,从而在数据稀缺时也能做出符合规律的预测。文章以热传导方程为例,手把手教你从零构建物理信息神经网络。 阅读详情

相关推荐

亚马逊SP-API授权实战:从OAuth流程到Refresh Token获取

本文详细解析了亚马逊SP-API授权流程,从OAuth认证到Refresh Token获取的全过程。通过实战经验分享,帮助开发者快速掌握Marketplace Appstore、Website Workflow和自行授权三种方式,解决常见错误如MD5100和MD9999,并提供了安全存储Refresh Token的最佳实践。

weixin_30379531的博客 518

SQLAlchemy 中的 Session、sessionmaker、scoped_session

目录 一、关于 Session 1. Session是缓存吗? 2. Session作用: 3. Session生命周期: 4. Session什么时候创建,提交,关闭? 4. 获取一个Session: 5. 关于SQLAlchemy 的 ...

weixin_30847271的博客 1055

KBS投稿全流程拆解:从模板准备到条件接收的实战指南

本文详细拆解了KBS期刊投稿的全流程,从模板准备、投稿系统操作到返修策略和条件接收。重点介绍了Cover Letter撰写技巧、Latex模板选择、审稿周期管理以及返修文件的系统准备方法,帮助研究者高效完成KBS投稿并提升接收概率。

weixin_26938645的博客 703

sqlalchemy/ scoped_session线程安全/基本增删查改/一对多(一对一)/多对多

【代码】sqlalchemy/ scoped_session线程安全/基本增删查改/一对多(一对一)/多对多。

python_web全栈 1138

RK3588开发板量产前必做:24小时DDR压力测试到底在测什么?(附ArmSoM-W3测试脚本解析)

本文深入解析RK3588开发板量产前的24小时DDR压力测试,揭示其核心价值与技术原理。通过memtester、stressapptest和变频测试的组合使用,全面验证DDR内存稳定性。特别介绍ArmSoM-W3测试脚本的创新设计,包括并行测试架构和异常熔断机制,为开发者提供可靠的量产测试方案。

weixin_30325487的博客 454

国产安路FPGA(二)-TD软件时序约束与硬件调试实战

本文深入探讨了国产安路FPGA开发中TD软件时序约束的实战应用。文章详细解析了SDC文件的核心语法,包括基础时钟、生成时钟及输入输出延迟约束的编写方法,并针对硬件调试中常见的时序问题提供了解决方案。通过一个图像处理流水线的优化案例,阐述了如何结合代码修改与约束设置,实现设计从“能跑”到“跑得稳”的关键提升,是掌握FPGA可靠设计的实用指南。

weixin_29183637的博客 377

SQLAlchemy 的 scoped_session

SQLAlchemy 的 scoped_session 是啥玩意 通常我们用 SQLAlchemy 写数据的时候要创建 Session 对象来维护数据库会话,用完了再关掉。但是听说还有个叫scoped_session的玩意,这是做啥用的? 这东西其实与 web 应用有一些关系。我们在使用 Django 的 ORM 的时候怎么没见到需要创建个 session 呢?因为它已经悄悄帮你实现好了维护 ...

lucyxu107的博客 9685

手把手教你用QEMU虚拟化华为路由器固件(附完整网络配置指南)

本文提供了一份详尽的QEMU虚拟化华为路由器固件的实战指南。从固件解包、网络桥接配置到QEMU虚拟机启动,手把手教你搭建完整的嵌入式设备沙箱环境,特别适合安全研究、逆向分析和学习嵌入式系统工作原理。

tgb3456789的博客 937

sqlalchemy scoped_session

是 SQLAlchemy ORM 提供的一个高级会话管理工具,它封装了标准的Session类,并提供了一种更加灵活和方便的方式来管理数据库会话的生命周期和作用域。的主要目的是为了在多线程或多进程环境下提供线程安全或请求安全的会话管理,确保每个线程或请求都能获得一个独立的会话实例。

youhebuke225的博客 1063

YOLOv13改进:原创自研 | 卷积魔改 | 一种新颖的风车形卷积(PConv)融合注意力机制,加强微弱小目标检测能力

风车形卷积(PConv)融合注意力机制进一步提升小目标检测能力

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1054

在 SAP ABAP 生态中偏爱面向对象,而不是过程式堆叠

本文探讨了ABAP开发中过程式与面向对象编程的共存现状及优化方向。文章指出,虽然过程式编程在ABAP中仍广泛存在,但随着业务复杂度提升,面向对象编程在可维护性、可测试性和重构便利性方面展现出明显优势。作者建议将过程式代码作为"适配层",仅负责输入输出转换,而将核心业务逻辑封装在类中。文章通过实际案例展示了这种架构如何提高交付效率,并提供了将Function Module转化为"薄包装"的具体实现方案,强调面向对象设计在SAP Gateway和RAP等现代架构中的重要性

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 136

关于[sqlalchemy] scoped_session

sqlalchemy scoped_session 介绍

Imba 2126

Close-By Site Assignment,门店近邻关系在 SAP Retail 物料搜索里的真实价值

SAP零售模块中的"Close-By Site Assignment"功能常被低估,但它在门店现场业务中极为关键。该功能允许预先定义各门店间的近邻关系,当导购或店长查询商品时,系统会自动展示附近门店的库存、价格和促销信息。与单纯的地理距离不同,这种近邻关系可基于调拨频率、业务关联度等业务逻辑定义。维护入口在事务码WSD_CBP中,支持按应用场景(如销售、采购)分别设置不同近邻关系。该功能不同于组织结构,专注于增强搜索体验,特别适合多门店运营场景,能有效提升跨店查询效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4851

SQLAlchemy 中的 Session,sessionmaker,scoped_session详解

一、关于SQLAlchemy 什么是SQLAlchemy? 答:SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升。 一句话:就是对数据库的抽象! Session 其实 就是一个会话, 可以和数据库打交道的一个会...

没有撤退可言. 8834

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

sqlalchemy 系列教程五-Session和scopedsession

sqlalchemy 中 session 是什么, scoped_session 又是什么 ? sqlalchemy 中的 session , scoped_session 的区别 摘要 : 本文 主要讲解 Session 是什么, scopedsession sqlalchemy 中的 session , scoped_session 的区别 是什么? 如何进行session 管理 ...

阿常呓语的专栏 5255

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

flask_sqlalchemy的session线程安全

flask_sqlalchemy是如何在多线程中对数据库操作不相互影响 参考来源: 1.https://www.cnblogs.com/lgjbky/p/9482278.html 2.http://www.cnblogs.com/ctztake/p/8277372.html 3.https://stackoverflow.com/questions/39480914/why-db-s...

luffyser的博客 3846

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Flask入门四(SQLAlchemy快速使用、原生sql操作、操作表、表模型、基于Scoped_Session实现线程安全、基本增删查改、高级查询、Flask-SQLAlchemy的使用)

1.自定义信号# 自定义一个数据库保存执行的信号2.写一个函数# args 没有拿到数据# kwargs 拿到其他数据,自定义的都是可以自己定制返回数据print('表数据插入了')3.跟自定义信号绑定4.在真正的数据库保存的时候执行port=3306,cursor.execute('INSERT INTO article (title,author) VALUES (%s,%s)',args=['测试标题1','测试作者1'])conn.commit() # 提交。

Mchen的博客 4649

python常用库之数据库orm框架之SQLAlchemy

SQLAlchemy是一个基于Python实现的SQL工具包和ORM框架,提供了高层抽象来管理数据库交互。

西京刀客 2万+

SQLAlchemy2.0使用

Python ORM框架王者,SQLAlchemy

qq_39839075的博客 1218

09. SQLAlchemy介绍

SQLAlchemy介绍一、SQLAlchemy介绍二、简单使用1、执行原生sql(不常用)2、orm使用(1)单表操作(2)一对多的关系,新增数据三、scoped_session线程安全四、基本增删查改查询删除修改as别名:占位符,用params传参数其他查询操作通配符限制(用于分页、区间)排序分组having筛选连表(默认使用forinkey关联)UNION组合(了解)五、多对多关系的建立和操作1、models.py2、基本增删查改六、flask-sqlalchemy的使用七、项目分文件使用flask-

梅开二度,异常绚烂 2441

Dify API 数据库连接与 Session 管理架构调研

本文档详细介绍了DifyAPI使用Flask-SQLAlchemy与PostgreSQL数据库交互的技术方案。核心内容包括:1) 采用Flask-SQLAlchemy作为ORM框架,通过scoped_session实现请求级Session管理;2) 数据库连接池配置及工作原理;3) 在Gevent协程环境下的特殊处理机制。重点分析了两种Session管理方式:标准db.session在Gevent下可能失效,推荐使用显式with Session()确保隔离性。文档还深入探讨了SQLAlchemy的缓存机制

adru的博客 690

SQLAlchemy

1.介绍 SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用对象关系映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 安装 pip3 install sqlalchemy 组成部分: Engine,框架的引擎 Connection Pooling ,数据库连接池 Dialec...

weixin_30483013的博客 132

Python:sqlalchemy中的session

每次调用session_maker()都会返回一个新的session对象,两次调用返回的session对象不同。 在一个线程中,多次调用scoped_session()返回的session对象是一个,类似单例模式。但是在不同线程中调用scoped_session()返回的session对象是不同的。 from sqlalchemy import cr...

weixin_34202952的博客 617
上一篇: a2.sqlalchemy-操作
下一篇: Docker时区timezone问题
AggressionStorm
博客等级 码龄9年 6粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值