sessionmaker()
ファクトリSession
です。新しいオブジェクトを作成するための構成オプションを1か所に配置することを奨励するために存在します。これはオプションです。冗長で冗長な場合を除いてSession(bind=engine, expire_on_commit=False)
、新しいが必要なときにいつでも簡単に呼び出すことができSession
、それぞれが新しい冗長性の問題に対処する小規模な「ヘルパー」の急増を阻止したかったので、そしてより混乱する方法。
したがってsessionmaker()
、Session
必要なときにオブジェクトを作成するためのツールにすぎません。
次の部分。問題は、Session()
さまざまな時点で新しく作成することと、1つだけを使用することの違いは何だと思います。答えは、それほどではありません。 Session
入れたすべてのオブジェクトのコンテナであり、開いているトランザクションも追跡します。rollback()
またはを呼び出した時点でcommit()
トランザクションは終了し、Session
SQLを再度発行するように要求されるまで、データベースへの接続はありません。マップされたオブジェクトへのリンクは、オブジェクトが保留中の変更をSession
除去している限り、弱い参照です。そのため、アプリケーションがマップされたオブジェクトへのすべての参照を失うと、それ自体が空になり、新しい状態に戻ります。デフォルトのままにしておくと"expire_on_commit"
設定すると、コミット後にすべてのオブジェクトが期限切れになります。それがSession
5〜20分間滞留し、次にそれを使用するときにすべての種類のものがデータベースで変更された場合、それらがメモリに座っていたとしても、次にそれらのオブジェクトにアクセスするときにすべての新しい状態がロードされます。 20分間。
Webアプリケーションでは、通常Session
、同じリクエストを何度も使用するのではなく、リクエストごとにまったく新しいものを作成してみませんか。これにより、新しいリクエストが確実に「クリーン」に開始されます。以前のリクエストの一部のオブジェクトがまだガベージコレクションされておらず、オフ"expire_on_commit"
になっている場合、以前のリクエストの一部の状態がまだ残っており、その状態はかなり古い可能性があります。expire_on_commit
電源を入れたままにしておき、間違いなく電話commit()
またはrollback()
リクエストの終わりに注意を払うのであればSession
問題ありませんが、まったく新しいから始めるのであれば、問題なく開始できるという質問すらありません。つまり、各リクエストを新しいものから始めるというアイデアSession
expire_on_commit
このフラグcommit()
は、一連の操作の途中で呼び出す操作に対して追加のSQLを大量に発生させる可能性があるため、新しく開始することを確認し、ほとんどの使用をオプションにするための本当に最も簡単な方法です。これがあなたの質問に答えるかどうかわかりません。
次のラウンドはあなたがスレッドについて言及するものです。アプリがマルチスレッド化されている場合Session
、使用中のものをローカルのものにすることをお勧めします。 scoped_session()
デフォルトでは、現在のスレッドに対してローカルになります。Webアプリでは、リクエストに対してローカルなほうが実際にはさらに優れています。Flask-SQLAlchemyは実際にカスタム「スコープ関数」を送信してscoped_session()
、リクエストスコープのセッションを取得します。平均的なPyramidアプリケーションは、セッションを「リクエスト」レジストリに貼り付けます。このようなスキームを使用する場合、「リクエストに応じて新しいセッションを作成する」という考え方は、物事をまっすぐに保つ最も簡単な方法のように見えます。