2012-01-23 3 views
0

Djangoの外でDjango ORMレイヤを使用しています。このプロジェクトは、社内で構築されたフレームワークを使用したWebアプリケーションです。Django ORMのみを使用する場合のデータベース接続管理

今、私はDjango ORMをスタンドアロンで実行するように設定するのに問題はありませんでしたが、私は接続管理についてちょっと心配しています。私は今ここでUsing only DB part of Djangoを読んでおり、Djangoは各要求の始めと終わりに特別な接続処理を行うのは事実です。 django/db/__init__.pyから:

# Register an event that closes the database connection 
# when a Django request is finished. 
def close_connection(**kwargs): 
    for conn in connections.all(): 
     conn.close() 
signals.request_finished.connect(close_connection) 

# Register an event that resets connection.queries 
# when a Django request is started. 
def reset_queries(**kwargs): 
    for conn in connections.all(): 
     conn.queries = [] 
signals.request_started.connect(reset_queries) 

# Register an event that rolls back the connections 
# when a Django request has an exception. 
def _rollback_on_exception(**kwargs): 
    from django.db import transaction 
    for conn in connections: 
     try: 
      transaction.rollback_unless_managed(using=conn) 
     except DatabaseError: 
      pass 
signals.got_request_exception.connect(_rollback_on_exception) 
私は、この接続管理をスキップした場合に実行することができますどのような問題

? (私のフレームワークにそれらの信号を簡単に差し込む方法はありません)

+0

接続管理の問題。あなたが貼り付けたコードの種類があなたのために処理されます。 –

+0

@burhan私は、このコードをスキップすることは安全ですか? Django ORMをスタンドアロンとして使用している人がいて、おそらくこのコードをスキップしている人がいることは知っています。正しく動作しているのでしょうか? – pajton

答えて

1

あなたの使用事例によって異なります。これらの機能のそれぞれは、あなたに影響を与えるかもしれないし、影響を与えないかもしれない特定のことをしています。

これは長時間実行され、DEBUGがオンの場合、クエリをリセットする必要があります。そうしないと、実行したすべてのクエリがメモリに保持されます。

多くのスレッドを起動する場合は、各スレッドの早い段階でDBに接続し、スレッドを実行したままにしておくと、DBの使用が終了したときに接続を閉じることもできます。あなたのDBの接続制限を打つ。

ほとんどの場合、_rollback_on_exceptionは必要ありません。関連するコード自体に目的のトランザクション動作が設定されていると仮定しています。

+0

DEBUGを無効にすることを覚えておきます。プロダクションのために私はおそらくいくつかのpg接続プーリング(私はポストグルを使用します)を使用します。したがって、_rollback_on_exceptionだけが残ります。私はDjangoの自動コミットの動作をほとんどの場合スティックする予定です - この場合は動作しますか?私は、論理的なデータ一貫性を提供する必要がある場合にのみトランザクションを使用することを計画しています。 – pajton

関連する問題