文档章节

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

lionets
 lionets
发布于 2015/04/28 15:49
字数 365
阅读 1875
收藏 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
博文 98
码字总数 132850
作品 0
朝阳
程序员
转-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
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
Flask入门数据库框架flask-SQLAlchemy(十)

Web程序开发中最重要的莫过于关系型数据库,即SQL 数据库,另外文档数据库(如 mongodb)、键值对数据库(如 redis)慢慢变得流行. 原因 : 我们不直接使用这些数据库引擎提供的 Python 包,而是...

善良小郎君
06/05
0
0
[flask-SQLAlchemy]关于flask-SQLAlchemy的初级使用教程

鉴于网上关于flask-SQLAlchemy的实例使用教程参差不齐,于此写下工作学习过程中的使用过程,以便分享交流。 对于python关于flask有一定了解的高端玩家来说,请转至flask官方开发文档。 一.安...

yzy121403725
05/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

No compiler is provided in this environment

maven 编译报错No compiler is provided in this environment 这个是由于maven在编译的过程中回使用到jdk ,它只会在环境变量中去寻找JAVA_HOME,如果没找到JAVA_HOME就会报这个错误。只要重...

优雅的胖子
9分钟前
0
0
(图文)最详细的XAMPP的安装及使用教程

XAMPP的安装及使用教程 1、简介 2、安装运行 3、配置Apache 4、配置MySQL 5、测试 6、修改MySQL默认密码 7、部署 XAMPP的安装及使用教程 1、简介 XAMPP(Apache+MySQL+PHP+PERL)是一个功能强...

梦梦阁
9分钟前
0
0
python 批量JSON数据,插入数据库

newList=[{"link":"https://www.1.com/","ga_tag":"xvideos","image":"http://static.2.mobi/views/images/xvideos.png?x-oss-process=style/120"},{"link":"https://www.3.com/","ga_tag":"......

Liens
11分钟前
0
0
mediarecord

mediarecorder what=268435556 -1007 解决方案 mPreviewSize = mCamera.getParameters().getPreferredPreviewSizeForVideo();...

zdglf
13分钟前
0
0
安装zookeeper和kafaka

安装zookeeper和kafaka http://mirrors.hust.edu.cn/apache/zookeeper/ http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/ http://mirrors.hust.edu.cn/apache/zookeeper/zoo......

蜗牛奔跑
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部