2013-02-14 12 views
10

私たちは20以上のモジュールを持つPythonアプリケーションを持っていますが、そのほとんどはいくつかのWebアプリケーションとコンソールアプリケーションで共有されています。複数モジュールのPythonアプリケーションでデータベース接続を確立し管理する方法を教えてください。

私は、マルチモジュールのPythonアプリケーションでデータベース接続を確立し管理するためのベストプラクティスをはっきりと理解していません。次の例を考えてみましょう。

私はユーザーのオブジェクトクラスを定義するモジュールを持っています。これは、データベース内のユーザーを作成/削除/更新するための多くのdefsを持っています。 users.pyモジュールは、a)コンソールベースのユーティリティ、2)web.pyベースのWebアプリケーション、3)常時実行されるデーモンプロセスにインポートされます。

これらの3つのアプリケーションは、それぞれ異なるライフサイクルを持ちます。デーモンは接続を開いて開いたままにすることができます。コンソールユーティリティが接続し、動作してから終了します。もちろん、http要求はアトミックですが、Webサーバーはデーモンです。

私は現在、開いている、接続を閉じることを使用して各機能の中にユーザークラスです。これは最も非効率的ですが、すべての例で機能します。テストとして使用される別の方法は、モジュール全体のグローバル接続を宣言して開くことです。もう一つの選択肢は、トップアプリケーション層で接続を作成し、クラスをインスタンス化するときに参照を渡すことですが、これは私にとって最悪の考えです。

私はすべてのアプリケーションアーキテクチャが異なることを知っています。私はベストプラクティスがあるのか​​どうか、それは何だろうと思っています。

+0

この[質問](http://stackoverflow.com/questions/98687/what-is-the-best-solution-for-database-connection-pooling-in-python)に従って接続プールを見てください – Mark

答えて

9

いくつかの操作(データの取得や更新など)が必要なときに接続を開くことをお勧めします。データを操作する。(パフォーマンスのために非常に重要)のクエリをというデータベースに書き戻し、接続を閉じます。接続を開くことはかなり軽いプロセスです。

パフォーマンスのためのいくつかの落とし穴は、あなたは間違いなくあなたが必要以上のデータを取るのセレクタ(例えば、すべてのユーザーに関するデータを取得し、それをフィルタを使用して、それ

  • と対話しませんデータベースを開く

    • が含まれます
    • 変更されていない値を書き込む(例えば、電子メールが変更されたときにユーザープロファイルのすべての値を更新する)
    • 各フィールドがサーバーを更新するようにする個別に(e dbを開いて、dbを開き、dbを閉じて、dbを閉じて、開いてください...)あなたはアイデアを得ます。

    最終行は次のとおりです。データベースを何回開いたかは問題ではなく、実行するクエリの数です。関連するクエリに参加するコードを取得することができれば、あなたは戦闘で勝利しました。

  • +0

    これは私が探していたもので、私の最高の推測を確認し、何も再加工する必要はありません!余分なヒントをありがとう - 私はすでにすべてをやっていますが、それは素晴らしいチェックリストでした。 – hikaru

    4

    MySQL接続は比較的高速です。これは問題ではない可能性があります(測定する必要があります)。他のほとんどのデータベースは、接続を作成するためにより多くのリソースを使用します。

    必要なときに新しい接続を作成することは、常に最も安全です。これが最初の選択肢です。いくつかのdbライブラリ、例えば。 SqlAlchemyでは、透過的に接続プールが構築され、接続が正しく再利用されます。

    あなたが生きて接続を維持したいことを決定した場合、あなたはそれを再利用できるように、注意すべきいくつかのポイントがあります:読み取りのみに使用されている

    1. の接続が容易ですデータベースのデータを変更するために使用した接続よりも再利用してください。

    2. 接続でトランザクションを開始するときには、他の誰かがその接続を使用中に他のものに使用できないように注意してください。

    3. 長い間座っているコネクションは古くなってしまいます。コネクションを再利用している場合は、まだアクティブかどうかを確認する必要があります。 「選択1」を送信し、結果を得ることを確認してください。

    独自の接続プーリングアルゴリズムを実装することをお勧めします。事態が悪化したときにデバッグするのは本当に難しいことです。代わりにあなたのためにそれを行うDBライブラリを選択してください。

    関連する問題