17

20 以上のモジュールを持つ Python アプリケーションがあり、そのほとんどは複数の Web アプリケーションとコンソール アプリケーションによって共有されています。

マルチ モジュール Python アプリでデータベース接続を確立および管理するためのベスト プラクティスを明確に理解したことがありません。次の例を検討してください。

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

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

私は現在、Users クラスの各関数内で接続を開き、使用して閉じています。これは最も効率が悪いように見えますが、すべての例で機能します。テストとして使用される代替手段は、モジュール全体のグローバル接続を宣言して開くことです。別のオプションは、最上位のアプリケーション層で接続を作成し、クラスをインスタンス化するときに参照を渡すことですが、これは私には最悪の考えです。

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

4

2 に答える 2

16

最善の方法は、何らかの操作 (データの取得や更新など) を行う必要があるときに接続を開くことです。データを操作します。1 つのクエリでデータベースに書き戻し(パフォーマンスにとって非常に重要)、接続を閉じます。接続を開くのは、かなり簡単なプロセスです。

パフォーマンスの落とし穴には次のものがあります。

  • データベースを確実に操作しないときにデータベースを開く
  • 必要以上のデータを取得するセレクターを使用する (たとえば、MySQL に不要なデータをフィルターで除外するように要求する代わりに、すべてのユーザーに関するデータを取得して Python でフィルター処理する)
  • 変更されていない値を書き込む (たとえば、メールだけが変更されたときに、ユーザー プロファイルのすべての値を更新する)
  • 各フィールドでサーバーを個別に更新します (たとえば、データベースを開く、ユーザーの電子メールを更新する、データベースを閉じる、データベースを開く、ユーザー パスワードを更新する、データベースを閉じる、開く... アイデアを得る)

肝心なのは、データベースを何回開くかは問題ではなく、実行するクエリの数です。コードを関連するクエリに参加させることができれば、戦いに勝ったことになります。

于 2013-02-14T20:37:55.537 に答える
4

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

必要なときに新しい接続を作成することが常に最も安全であり、最初の選択肢として適しています。SqlAlchemy などの一部の db ライブラリには、透過的に接続を正しく再利用する接続プールが組み込まれています。

再利用できるように接続を維持したい場合は、次の点に注意してください。

  1. 読み取り専用の接続は、データベース データの変更に使用した接続よりも簡単に再利用できます。

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

  3. 長い間放置されている接続は古くなり、あなたの下から閉じられる可能性があります。そのため、接続を再利用している場合は、「select 1」を送信して、「生きている」かどうかを確認する必要があります。結果が得られることを確認します。

個人的には、独自の接続プーリング アルゴリズムを実装しないことをお勧めします。問題が発生したときにデバッグするのは非常に困難です。代わりに、それを行う db ライブラリを選択してください。

于 2013-02-14T20:45:38.660 に答える