コンテキスト: 私は、SQLAlchemy ORM を使用して処理される DB、CherryPy で実行される Flask アプリに取り組んでいます。
問題:
アプリは正常に動作し、必要なことはすべて実行しますが、DB からデータを取得して表示するページがあり、「Ctrl + R」または「F5」を押したままにすると、つまり、ページを継続的に更新し、その数の DB 要求を行います。最初のいくつかはうまくいきますが、その後壊れます。次のエラーが記録されます。
(OperationalError) (2013, 'Lost connection to MySQL server during query')
Can't reconnect until invalid transaction is rolled back (original cause:
InvalidRequestError: Can't reconnect until invalid transaction is rolled back)
This result object does not return rows. It has been closed automatically.
(ProgrammingError) (2014, "Commands out of sync; you can't run this command now")
気になる別のエラーもあります(ただし、今回は記録されていません)。
dictionary changed size during iteration
これは、辞書を作成するために取得した値を使用して、クエリを反復処理しているときに発生します。ディクショナリは、関数に対してローカル (dict のスコープ) です。
より詳しい情報:
セッションの処理方法:
ページに入ると新しいセッションが作成され、そのセッションを使用してすべての DB トランザクションが実行され、セッションは HTML をレンダリングする直前に閉じられます。つまり、技術的には、セッションのスコープは HTTP リクエストと同じです。
テーブル中またはテーブルsession.rollback()
に例外が発生した場合にのみ実行します。いいえ、操作中はありません。ばかげた間違いを犯したか、正しい方法で物事を行っていないことは間違いありません。updating
inserting
rollback()
query()
そのような無制限の更新は実際にはありそうなシナリオではありませんが、見逃すことはできません。また、同時に多くのユーザーが使用している場合も同様の動作になると思います。
SQLAlchemy エンジン、sessionmaker の処理方法:
sql_alchemy_engine = create_engine(self.db_string, echo=False, encoding="utf8", convert_unicode=True, pool_recycle=9)
sqla_session = sessionmaker(bind=sql_alchemy_engine)
SQLA ドキュメントで推奨されているように、一度だけ実行され、新しいセッションが作成され、sqla_session()
必要に応じて返されます。