SQLAlchemy连接池和会话

9 python session connection-pooling sqlalchemy flask

我最近开始使用SQLAlchemy,并想了解如何connection pool以及session在工作web-application

我正在构建一个API使用flask.

__init__.py

engine = create_engine('mysql://username:password@localhost/my_database') 
DBSession = sessionmaker(bind=engine)
Run Code Online (Sandbox Code Playgroud)

views.py

@app.route('/books', methods = ['GET'])
def getBooks():
    session = DBSession()
    returnedBooks = session.query(BOOK).all()
    session.close()

    return something...
Run Code Online (Sandbox Code Playgroud)

1)首先,如果我没有明确关闭我的session对象,它会request在处理后自动关闭吗?

2)当我的应用程序收到多个时requests,session创建的多个对象是否都链接到engine我的__init__.py文件中创建的单个对象?

3)为session创建对象view.pyconnections,该connection pool持有?如果是这样,并且这些没有关闭,那么是否必须为后续请求建立新的连接?

4)我应该dispose()在某个时候使用吗?

Sin*_*ion 15

1)首先,如果我没有明确关闭我的会话对象,它会在请求处理后自动关闭吗?

垃圾收集器最终将*调用__del__会话.如果会话尚未以其他方式排序,则可能会导致回滚.你通常应该这样做:

import contextlib
def myRequestHandler(args):
    with contextlib.closing(DBSession()) as session:
        result = do_stuff(session)
        if neccesary:
            session.commit() 
        else:
            session.rollback()
        return result
Run Code Online (Sandbox Code Playgroud)

2)当我的应用程序收到多个请求时,创建的多个会话对象是否都链接到我的__init__.py文件中创建的单个引擎对象?

是的,sessionmaker()坚持所有Session配置.使用您已经获得的模式,您将获得每个请求的新会话,这是一件好事.

3)会话对象是否在view.py中创建了连接池所包含的连接?

会话和联系不是一回事; 虽然每个会话一次使用一个连接,但是当它们完成后,它们会返回到池中的连接.

如果是这样,并且这些没有关闭,那么是否必须为后续请求建立新的连接?

不同的池实现有不同的规则,但对于大多数数据库引擎,默认是QueuePool; 它的默认最大连接数为15.对于其他连接的子序列请求将阻塞或超时.但是,尽可能重用连接.

4)我应该在某个时候使用dispose()吗?

通常不会,如果您还使用池和引擎和会话,则可能不需要提交/回滚会话之外的任何其他资源管理

*最终实际上意味着在某个时间之间,从不存在; 不要指望它做有用的工作; 请注意,当您的进程终止时,操作系统会强制关闭您的连接,因此使用GC进行连接管理并不能为您带来任何好处.