【问题标题】:Triggering connection pools with sqlalchemy in flask在烧瓶中使用 sqlalchemy 触发连接池
【发布时间】:2014-12-11 13:11:07
【问题描述】:

我正在为我的服务器使用 Flask + SQLAlchemy(DB 是 Postgres),我想知道连接池是如何发生的。我知道它默认启用,池大小为 5,但我不知道我的代码是否触发它。

假设我使用默认的烧瓶 SQLalchemy 桥:

db = SQLAlchemy(app)

然后使用该对象进行数据库调用,例如

db.session.query(......)

flask-sqlalchemy 如何在后台管理连接池?每次我访问 db.session 时它都会抓取一个新会话吗?这个对象什么时候返回到池中(假设我没有将它存储在局部变量中)?

编写代码以最大化并发性 + 性能的正确模式是什么?如果我以一种串行方法多次访问数据库,是否每次都使用 db.session 是个好主意?

我无法找到有关这种方式的文档,所以我不知道幕后发生了什么(代码有效,但它会扩展吗?)

谢谢!

【问题讨论】:

  • 您遇到了什么具体问题?
  • 我不知道我的服务器在重负载下将如何响应 - 多个并发请求会同时进入阻塞吗?他们会得到正确的对待吗?我是否会比我必须的更多地将物体带入/归还到池中?游泳池是否会扩大到超出预期范围?
  • 我正在使用 Flask-SQLAlchemy 并获得 70 多个并发连接,它工作得很好。
  • 这并不一定能回答它是如何工作的。我知道它确实有效。我相信(可能是错误的)reddit 使用 SQLAlchemy。
  • 如果您指的是 SQLAlchemy 如何处理会话,我认为它使用 SQLAlchemy 的 scoped_session

标签: python postgresql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

您可以使用事件注册 - http://docs.sqlalchemy.org/en/latest/core/event.html#event-registration 可以监控的事件类型有很多,checkoutcheckinconnect 等等... - http://docs.sqlalchemy.org/en/latest/core/events.html

这是文档中有关在建立新连接时打印 a 的基本示例。

from sqlalchemy.event import listen
from sqlalchemy.pool import Pool

def my_on_connect(dbapi_con, connection_record):
    print "New DBAPI connection:", dbapi_con

listen(Pool, 'connect', my_on_connect)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2016-11-14
    • 2011-12-16
    相关资源
    最近更新 更多