我最近开始使用SQLAlchemy
并尝试了解connection pool
和session
在web-application
我正在使用API
构建flask
。
__初始化__。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
对象是否都链接到在我的engine
文件中创建的单个__init__.py
对象?
3)session
对象是否在view.py
connections
connection pool
中创建了dispose()
对象?如果是这样,并且这些没有关闭,那么是否必须为后续请求建立新的连接?
4)我应该在某个时候使用{{1}}吗?
答案 0 :(得分:12)
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
2)当我的应用收到多个请求时,是多个会话 正在创建的对象都链接到单个引擎对象 在我的
__init__.py
文件中创建?
是的,sessionmaker()
保留所有Session
配置。使用你已经获得的模式,你将获得每个请求的新会话,这是一件好事。
3)会话对象是否在view.py中创建了连接 连接池包含?
sessions and connections不是一回事;虽然每个会话一次使用一个连接,但是当它们完成后,它们会将它们的连接返回到池中。
如果是这样,那么这些都没有关闭 是否必须为后续请求建立新的连接?
different pool implementations有不同的规则,但对于大多数数据库引擎,默认值为QueuePool
;它的默认最大连接数为15.对于其他连接的子序列请求将阻塞或超时。但是,尽可能重用连接。
4)我应该在某个时候使用dispose()吗?
通常不会,如果您还使用池和引擎和会话,则可能不需要提交/回滚会话之外的任何其他资源管理
*最终实际上意味着在某个时间之间和从不;不要指望它做有用的工作;请注意,当您的进程终止时,操作系统会强制关闭您的连接,因此使用GC进行连接管理不会给您带来任何好处。