0

現在、SQLAlchemyを抽象化するクラスを開発しています。このクラスは、データベースからの値を検証するためのヘルパーツールとして機能します。このクラスは、回帰/負荷テストで使用されます。テストケースは、数十万のデータベースクエリを作成します。私のクラスのレイアウトは次のとおりです。

class MyDBClass:
    def __init__(self, dbName)
         self.dbName = dbName
         self.dbEngines[dbName] = create_engine()
         self.dbMetaData[dbName] = MetaData()
         self.dbMetaData[dbName].reflect(bind=self.dbEngines[dbName])
         self.dbSession[dbName] = sessionmaker(bind=self.dbEngines[dbName])

    def QueryFunction(self,dbName, tablename, some arguments):
          session = self.dbSession[dbName]()
          query = session.query(requiredTable)
          result = query.filter().all()
          session.close()
    def updateFunction(self, dbName, talbeName, some arguments):
          session = self.dbSession[dbName]()
          session.query(requiredTable).filter().update()
          session.commit()
          session.close()
    def insertFunction(self, dbName, tableName, some arguments):
          connection = self.dbEngines[dbName].connect()
          requiredTable = self.dbMetaData[dbName].tables[tableName]
          connection.execute(requiredTable.insert(values=columnValuePair))
          connection.close()
    def cleanClose(self):
          # Code which will remove the connection/session/object from memory.
          # do some graceful work to clean close.

このクラスによって作成される可能性のあるオブジェクトを削除するcleanClose()メソッドを作成したいと思います。このメソッドは、これらすべてのオブジェクトをメモリから削除し、クリーンクローズを提供する必要があります。これにより、メモリリークを回避することもできます。すべてのオブジェクトをメモリから削除する必要があるかどうかを理解できません。ここで行う必要のあるメソッド呼び出しを誰かに提案してもらえますか?

編集1:

パフォーマンスの異なる方法とその変形を測定する方法はありますか?ここでドキュメント
を調べ ていたところ、すべてのメソッドでセッションを作成するのではなく、セッションの単一インスタンスを作成して全体で使用する必要があることに気付きました。これについてフィードバックをお寄せください。そして、ここで物事を行うための最良の方法を教えてください。

どんな種類の助けもここで大いに感謝されるでしょう。

4

1 に答える 1

3

Pythonでメモリからオブジェクトを削除するには、オブジェクトの参照を停止する必要があります。通常、オブジェクトを破棄またはクリーンアップするために、メソッドを明示的に記述または呼び出す必要はありません。したがって、のインスタンスはMyDBClass、スコープ外になると自動的にクリーンアップされます。

SQLAlchemyセッションを閉じることについて話している場合は、そのセッションでclose()メソッドを呼び出す必要があります。

SQLAlchemyセッションは、複数のトランザクション用に設計されています。通常、複数回作成および破棄する必要はありません。__init__関数で1つのセッションを作成し、それをQueryFunctionupdateFunctionなどで使用します。

于 2012-06-28T18:11:17.293 に答える