2016-07-26 11 views
2

Flaskのリクエストで再利用できるデータベースへの接続プールを作成する必要があります。ドキュメント(0.11.x)は、データベース接続を格納するアプリケーションコンテキストであるgを使用することを提案しています。フラスコのアプリケーションコンテキストとグローバル接続

アプリケーションのコンテキストが作成され、各要求の前後に破棄されるという問題があります。したがって、作成される接続の数に制限はなく、接続は再利用されません。私が使用していたコードは次のとおりです。

def get_some_connection(): 
    if not hasattr(g, 'some_connection'): 
     logger.info('creating connection') 
     g.some_connection = SomeConnection() 
    return g.some_connection 

@app.teardown_appcontext 
def destroy_some_connection(error): 
    logger.info('destroying some connection') 
    g.some_connection.close() 

接続を閉じるには、この意図的な、つまり、フラスコを新鮮接続毎回を作成する、または使用して、いくつかの問題がありますされています私のコードのアプリケーションコンテキストの。また、意図的に接続がグローバルになる回避策がある場合。私は、古い拡張のいくつかはapp['extension']自体で接続を維持していることがわかります。

答えて

2

いいえ、何らかの種類のグローバル接続プールが必要です。 gではリクエスト全体で状態を共有できるので、リクエストを処理するために呼び出されるさまざまなテンプレートと関数の間で、その 'グローバル'状態を渡す必要はありませんが、モジュールグローバル変数モジュールと同じ寿命)。

データベース接続をgに設定して、すべてのリクエストコードが1つの接続だけを使用するようにしても、(モジュール)グローバルプールから引き続き接続を自由に行うことができます。

スレッドごとに接続を作成してプールすることをおすすめします。これをゼロから構築するか(おそらくthreading.localオブジェクトを使用する)、という優れた接続プールの実装であるに付属するSQLAlchemyのようなプロジェクトを使用することができます。これは基本的にFlask-SQLAlchemy extensionの機能です。

+0

次に、要求コンテキストとアプリケーションコンテキストの違いは何ですか。 –

+0

@SiddharthGupta:アプリコンテキストが長く続く。要求コンテキストが作成される前に存在し、応答が設定された直後まで存在します。 –

関連する問題