文档章节

web 项目中 SQLAlchemy session 的生命周期管理

lionets
 lionets
发布于 2015/04/28 15:49
字数 365
阅读 2075
收藏 4

假设已有一个 Session 工厂类:

lang:python
Session = sessionmaker(bind=some_engine)

那么 session 实例的生命周期可以为:


###最短模式 —— 每次请求新建一个 session,用完就 close

lang:python
@contextmanager
def get_session_scope():
    try:
        s = Session()
        yield s
        s.commit()
    except:
        s.rollback()
    finally:
        s.close()

这种模式不适合 web 项目或者说其缺点主要在于对 连接池(db pool) 的消耗过快。实际使用中发现,被 close 的 session 的 连接并没有即时返回可用状态。因此在请求频繁时,会出现等待连接的情况。


###最长模式 —— 全程使用一个 session

lang:python
session = Session()

这种方式更加不适合 web 项目。因为根据 SQLAlchemy 的文档描述

The Session object is entirely designed to be used in a non-concurrent fashion, which in terms of multithreading means “only in one thread at a time”.

session 并不是线程安全的。这种并发式的 session 使用会导致错误。


###Thread-Local模式 —— 生命周期与 request 同步

lang:python
@app.before_request
def init_session():
    g.session = Session()
    
@app.tear_down_request
def close_session():
    g.session.close()

这其实才是最适合 web 项目的 session 管理方式。(伪代码中没有写 commit 和 rollback,可自行添加)这样即避免了连接池的过快消耗,又避免了并发问题。这也是 SQLAlchemy 文档中推荐的做法。

实践上更靠谱的一段代码可能是:

lang:python
from sqlalchemy.orm import scoped_session, sessionmaker
from flask import g

Session = scoped_session(sessionmaker(bind=some_engine), scopefunc=g._get_current_object)

更更可靠的一种方法应该是使用官方扩展,如 Flask-SqlAlchemy

© 著作权归作者所有

共有 人打赏支持
lionets
粉丝 90
博文 101
码字总数 135303
作品 0
朝阳
程序员
私信 提问
SQLAlchemy 和其他的 ORM 框架

Python ORM 概览 作为一个美妙的语言,Python 除了 SQLAlchemy 外还有很多ORM库。在这篇文章里,我们将来看看几个流行的可选 ORM 库,以此更好地窥探到Python ORM 境况。通过写一段脚本来读写...

oschina
2014/05/03
19.7K
6
转-SQLAlchemy and You

written on Tuesday, July 19, 2011 from:http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/ Without doubt are most new Python web programmers these days chosing the Django frame......

玉龙
2011/07/26
0
0
web.py开发web 第五章 视图中使用sqlalchemy

前两章讲了一些sqlalchemy的基础使用,这一章要讲的就是在视图中调用sqlalchemy,同时这一章还要讲下web.py的类视图的一个使用技巧。 web.py支持中间件的设置,所以我们先写一个middleware....

桶装更尽兴
2013/04/08
0
2
Flask中可以利用Flask-SQLAlchemy

官方文档:http://flask-sqlalchemy.pocoo.org/2.3/ 1.安装(进入虚拟环境)--利用镜像安装PyMySQL #python36 -m pip install PyMySQL -i http://pypi.mirrors.ustc.edu.cn/simple --trusted-......

编译中ing
10/04
0
0
SQLAlchemy ORM 参考

Session --- 创建 from sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmaker engine = create_engine('sqlite:///:memory:', echo=False)Session = sessionmaker(bind=......

lionets
2014/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
10
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
16
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
15
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
8
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部