2

複数のデータベース (400 以上) に接続する django アプリケーションがあります。データベース資格情報は頻繁に変更されます。静的セットアップが必要なため、django データベース サポートを使用できません。

そのため、カーソルを返すページをロードするときに動的データベース接続を作成します。

次の質問があります。

  • これはカーソルを解放する適切な方法ですか (デストラクタ__ del _を使用 )
  • close() メソッドを直接使用する場合、デストラクタは安全ですか?
  • 接続オブジェクトに対して同様のことを行う必要がありますか、それともカーソルを閉じるだけで十分ですか?
  • これに対して提案された標準的な解決策はありますか?

    class MyDatabaseManager(object):
        def __init__(self, database_name):
            self.cursor = None
            #for safety in case next command return an exception
            self.cursor = some_object.get_cursor(database_name)
    
        def close(self):
            self.cursor.close()
            self.cursor = None
    
        def __del__(self):
            if not (self.cursor is None):
                self.close()
    
        def execute_query(self, sql_query, parameter_list):
            return self.cursor.execute(sql_query, parameter_list)
    
4

1 に答える 1

0

一般的なコンセンサスは、 __del__を使用しないことです。以前の 回答から要約するには:

  1. これまでに、またはいつ呼び出されるとは想定できません。
  2. delキーワードによって __del__ が呼び出されることはありません。
  3. ガベージ コレクションが正しく機能しない (メモリ リーク) 可能性があります。
  4. 代わりに明示的なアプローチ (クリーンアップ関数を手動で呼び出す) または弱参照を使用してください。

それはあなたの質問1、2、および4に答えるはずです。3.の質問に関して:使用しているデータベースアダプターがpython dbapi2(dbmsアダプターの一般的な形式)に準拠している場合、カーソルを閉じても接続を閉じる必要があるわけではありません. したがって、作成されたすべてのカーソルが閉じられた場合でも、接続は開いたままです。

于 2012-05-19T17:45:55.030 に答える