SQLAlchemy 连接池和会话

SQLAlchemy Connection Pool and Sessions

我最近开始使用 SQLAlchemy 并试图了解 connection poolsessionweb-application

中的工作原理

我正在使用 flask 构建一个 API

__init__.py

engine = create_engine('mysql://username:password@localhost/my_database') 
DBSession = sessionmaker(bind=engine)

views.py

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

    return something...

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

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

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

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

1) Firstly, if I don't explicitly close my session object, will it automatically close after the request has been processed?

垃圾收集器最终*会在会话中调用 __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

2) When my app receives multiple requests, are the multiple session objects being created all linked to the single engine object that was created in my __init__.py file?

是的,sessionmaker() 保留所有 Session 配置。使用您获得的模式,您将为每个请求获得一个新会话,这是一件好事。

3) Are the session objects being created in view.py the connections that the connection pool holds?

sessions and connections 不是一回事;尽管每个会话一次都使用一个连接,并且他们 return 在完成连接后会连接到池。

If so, and these weren't closed, then would new connections have to be made for subsequent requests?

different pool implementations have different rules, but for most database engines, the default is QueuePool;它的默认最大连接数为 15。对额外连接的后续请求将被阻止或超时。不过,尽可能重用连接。

4) Should I be using dispose() at some point?

通常不需要,如果您还使用池、引擎和会话,那么可能不需要 committing/rolling 后台会话之外的任何额外资源管理

*eventually 实际上意味着介于立即和永不之间的某个时间;不要指望它做有用的工作;请注意,当您的进程终止时,您的连接将被 OS 强制关闭,因此使用 GC 进行连接管理不会给您带来任何好处。