2014-10-04 13 views
7

tôi đang xây dựng một ứng dụng web với cơn lốc xoáy + SQLAlchemy và hoàn toàn ngẫu nhiên tôi đã nhận lỗi nàySQLAlchemy + Tornado: không thể kết nối lại cho đến khi giao dịch không hợp lệ được cuộn lại

 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 

tôi không thể tìm ra cách để giải quyết điều này. Tôi đã đặt tất cả db.commit vào một số

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

Đó là ứng dụng lớp học của tôi.

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) 

nhưng không có gì. Cách tốt nhất để cấu hình sqlalchemy và lốc xoáy cho một ứng dụng web như mysql + php là gì?

+0

Đây cũng là vấn đề của tôi. Với khung công tác falcon + gevent + uwsgi – Farsheed

+0

@FaraonWEB bạn đã giải quyết vấn đề này chưa? – pregmatch

Trả lời

1

Tôi nhớ có lần phát hành giống nhau trước đây. Dường như có một số thứ kỳ lạ liên quan đến kết nối tổng hợp. Vô hiệu hóa pooling seemd để sửa nó. Không phải là ý tưởng hay nhất nói chung, nhưng nó hoạt động.

Hãy thử qua poolclass=NullPool để create_engine

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

cách của tôi là làm rollback lớp sơn hoàn thiện, thêm video này vào BaseHandler của bạn:

def on_finish(self): 
    if self.get_status() == 500: 
     self.db_session.rollback() 
Các vấn đề liên quan