【问题标题】:PSQL connection closing time delay using SQLAlchemy使用 SQLAlchemy 的 PSQL 连接关闭时间延迟
【发布时间】:2018-06-14 10:58:28
【问题描述】:
  • 为什么在调用 session.close() 和会话实际关闭之间似乎存在明显延迟?
  • 我正在以一种感觉不对劲的方式“用尽”连接。有没有更好的方法或我缺少的设计模式?

按照指南here,我使用以下代码,为了完整性而复制:

@contextmanager
def session_scope():
    """Provide a transactional scope around a series of operations."""
    session = Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()


def run_my_program():
    with session_scope() as session:
        ThingOne().go(session)
        ThingTwo().go(session)

这对于可靠地提交数据和避免无效会话非常有用。 问题在于达到连接限制。

例如,假设我有一个页面每次访问进行 5 次异步调用。如果我访问该页面并快速连续点击刷新,它将产生5 * number_times_refreshed 连接。它最终会关闭它们,但会有不可忽略的时间延迟。

【问题讨论】:

  • Closing a session 不会关闭连接,而是将其返回到连接池,连接池将它们交给下一个需要的会话等。这就是它的基本原理,但我想说,“异步”这个词加上快速刷新使它变得更加复杂。
  • 谢谢 - 我在本地做了更多测试。这是一个更新:当我使用上面的代码运行一个简单的程序时,连接按预期“关闭”(至少这是日志文件中使用的词) - 立即。但是,如果我在 with 块之后有一个 time.sleep() ,它似乎只会在 time.sleep() 完成后关闭连接。不确定我是否真的在这里遗漏了什么,但开始认为这是其他东西以某种方式影响它

标签: python postgresql session sqlalchemy psql


【解决方案1】:

问题是使用 sessionmaker() 和绑定数据库引擎。具体来说这不是好方法:

def newSession():
    engine = create_engine(settings.DATABASE_URL)
    Base.metadata.bind = engine
    DBSession = sessionmaker(bind=engine)

    session = DBSession()

    return session

@contextmanager
def session_scope():
    session = newSession()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

这会为每个请求创建一个新引擎。除了这是一个糟糕的模式之外,它还导致混淆了哪个“连接”正在关闭。在这种情况下,我们有一个“会话”和一个“DBSession”。会话确实通过 session.close() 关闭,但这不会触及“DBSession”。

更好的方法(解决方案):

engine = create_engine(settings.DATABASE_URL)
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)

@contextmanager
def session_scope():
    session = DBSession()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

在应用的生命周期内创建一个连接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2018-01-02
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多