63

Flask / SQLAlchemy が存在しない場合、新しいデータベース接続を作成するように構成するにはどうすればよいですか?

SQLAlchemy を使用する Python/Flask サーバーを頻繁に訪問していません。数日ごとに訪問され、最初の訪問で「MySQL サーバーがなくなりました」というエラーがスローされることがよくあります。その後のページ ビューは問題ありませんが、この最初のエラーが発生するのは専門外に見えます。

これを処理する正しい方法を知りたいです。この場合、約 4 日間かかる「非常に長いタイムアウトを作成する」などのアドバイスは正しくないようです。データベース接続がないことをテストし、必要に応じて作成するにはどうすればよいですか?

4

7 に答える 7

51

私は以前にこれに問題を抱えていましたが、それを処理する方法はセッションを維持しないことであることがわかりました。問題は、接続を長時間開いたままにしようとしていることです。__init__.py代わりに、どこにでもインポートするユーティリティパッケージ内またはユーティリティパッケージ内で、次のようなスレッドローカルスコープセッションを使用します。

from sqlalchemy.orm import scoped_session, sessionmaker
Session = scoped_session( sessionmaker() )

次に、エンジンとメタデータを一度設定します。これにより、接続/切断するたびに構成メカニズムをスキップできます。その後、次のようにデータベースの作業を行うことができます。

session = Session()
someObject = session.query( someMappedClass ).get( someId )
# use session like normal ...
session.close()

古いオブジェクトを保持したいが、セッションを開いたままにしたくない場合は、上記のパターンを使用して、次のように古いオブジェクトを再利用できます。

session = Session()
someObject = session.merge( someObject )
# more db stuff
session.close()

The point is, you want to open your session, do your work, then close your session. This avoids timeouts very well. There are lots of options for .merge and .add that allow you to either include changes you've made to detached objects or to load new data from the db. The docs are very verbose, but once you know what you are looking for it might be a little easier to find.

To actually get all the way there and prevent the MySQL from "going away", you need to solve the issue of your connection pool keeping connections open too long and checking out an old connection for you.

To get a fresh connection, you can set the pool_recycle option in your create_engine call. Set this pool_recycle to the number of seconds of time in the connection pool between checkouts that you want a new connection to be created instead of an existing connection to be returned.

于 2011-06-24T20:13:05.600 に答える
37

私も同様の問題を抱えていましたが、私の場合、各セッションの 5 分から 2 時間の間に「MySQL が消えました」というエラーが表示されました。

私はFlask-SQLAlchemyを使用しているので、アイドル状態の接続を閉じることになっていますが、接続が数時間以上アイドル状態でない限り、そうしていないようです。

最終的に、次の Flask-SQLAlchemy 設定に絞り込みました。

app.config['SQLALCHEMY_POOL_SIZE'] = 100
app.config['SQLALCHEMY_POOL_RECYCLE'] = 280

これらのデフォルト設定は、それぞれ 10 および 7200 (2 時間) です。

環境に合わせてこれらの設定をいじってみるのは問題です。

たとえば、SQLALCHEMY_POOL_RECYCLE を 3600 に設定する必要があると多くの場所で読みましたが、それはうまくいきませんでした。私は PythonAnywhere でホストしていますが、5 分 (300 秒) 後にアイドル状態の MySQL 接続を強制終了します。したがって、値を 300 未満に設定すると問題が解決しました。

この問題にあまりにも多くの時間を無駄にしたので、これが他の人に役立つことを願っています.

http://flask-sqlalchemy.pocoo.org/2.1/config/#configuration-keys

更新: 2019 年 10 月 8 日

構成キー'SQLALCHEMY_POOL_SIZE''SQLALCHEMY_POOL_RECYCLE'は v2.4 で廃止され、SQLAlchemy の v3.0 で削除されます。'SQLALCHEMY_ENGINE_OPTIONS'対応する値を設定するために使用します。

app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {'pool_size' : 100, 'pool_recycle' : 280}
于 2016-03-05T21:00:25.080 に答える
6

Flask-SQLAlchemy を使用している場合:

修正が利用可能のようです: https://github.com/mitsuhiko/flask-sqlalchemy/issues/2

悲しいことに、デフォルトのインストール (pip install Flask- sqlalchemy ) では、特にこの問題に関して、まだパッチが適切に適用されません:

github から最新バージョンを取得すると、修正されるはずです。

于 2013-01-20T11:41:34.043 に答える