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.py的connections,该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进行连接管理并不能为您带来任何好处.
| 归档时间: |
|
| 查看次数: |
7416 次 |
| 最近记录: |