SqlAlchemy + Tornado:在回滚无效事务之前无法重新连接

Posted

技术标签:

【中文标题】SqlAlchemy + Tornado:在回滚无效事务之前无法重新连接【英文标题】:SqlAlchemy+Tornado: can't reconnect until invalid transaction is rolled back 【发布时间】:2014-11-29 05:21:02 【问题描述】:

我正在使用 tornado+sqlalchemy 构建一个 webapp,并且完全随机我得到了这个错误

     File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1024, in _handle_dbapi_exception
    exc_info
  File "/usr/lib/python3/dist-packages/sqlalchemy/util/compat.py", line 187, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=exc_value)
  File "/usr/lib/python3/dist-packages/sqlalchemy/util/compat.py", line 182, in reraise
    raise value.with_traceback(tb)
  File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 822, in _execute_context
    conn = self._revalidate_connection()
  File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 239, in _revalidate_connection
    "Can't reconnect until invalid "
sqlalchemy.exc.StatementError: Can't reconnect until invalid transaction is rolled back

我不知道如何解决这个问题。我已将所有 db.commit 放入一个

try:
  self.db.commit()
except Exception(e):
  self.db.rollback()

这是我的班级申请。

class Application
        [...]
        engine = create_engine(options.db_path, convert_unicode=True, echo=options.debug)
        models.init_db(engine)
        self.db = scoped_session(sessionmaker(bind=engine))
        tornado.web.Application.__init__(self, handlers, **settings)

但什么都没有。 为 mysql+php 等 Web 应用程序配置 sqlalchemy 和 tornado 的最佳方法是什么?

【问题讨论】:

这也是我的问题。用falcon框架+gevent+uwsgi @FaraonWEB 你解决过这个问题吗? 【参考方案1】:

我的方法是完成后回滚,将其添加到您的 BaseHandler:

def on_finish(self):
    if self.get_status() == 500:
        self.db_session.rollback()

【讨论】:

【参考方案2】:

我记得不久前遇到过同样的问题。似乎有一些与连接池相关的奇怪东西。禁用池似乎修复了它。 总的来说,这不是最好的主意,但它确实有效。

尝试将poolclass=NullPool 传递给create_engine

...
from sqlalchemy.pool import NullPool
...
engine = create_engine(options.db_path, convert_unicode=True, echo=options.debug, poolclass=NullPool)

【讨论】:

以上是关于SqlAlchemy + Tornado:在回滚无效事务之前无法重新连接的主要内容,如果未能解决你的问题,请参考以下文章

安装VS2008过程中取消了安装,在回滚过程中强制关闭了该程序

JPA 和 Hibernate 实体标识符是不是在回滚后重置为 null?

Windows服务安装在回滚中结束

对Tornado异步操作Sqlalchemy方法的选定 不错

sqlalchemy在pythonweb中开发的使用(基于tornado的基础上)

tornado 07 数据库—ORM—SQLAlchemy—查询