SQLAlchemy 连接池和会话
SQLAlchemy Connection Pool and Sessions
我最近开始使用 SQLAlchemy
并试图了解 connection pool
和 session
在 web-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
中创建的 connections
中 connection 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 进行连接管理不会给您带来任何好处。
我最近开始使用 SQLAlchemy
并试图了解 connection pool
和 session
在 web-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
中创建的 connections
中 connection 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 进行连接管理不会给您带来任何好处。