【问题标题】:Database connection management when using only Django ORM仅使用 Django ORM 时的数据库连接管理
【发布时间】:2012-02-16 19:00:59
【问题描述】:

我在 Django 之外使用 Django ORM 层。该项目是一个使用 cusotm 内部构建框架的 Web 应用程序。

现在,我可以将 Django ORM 设置为独立运行,但我有点担心连接管理。我已经在 SO 阅读了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)

如果我跳过此连接管理会遇到什么问题? (我无法轻松地将这些信号插入到我的框架中)

【问题讨论】:

  • 连接管理问题;您粘贴的代码为您处理的类型。
  • @burhan 我的意思是,跳过这段代码安全吗?我知道有些人使用 Django ORM 作为独立的,他们可能会跳过这段代码,我想知道它是否正常工作。

标签: python database django database-connection django-orm


【解决方案1】:

这取决于您的用例。这些功能中的每一个都会做一些特定的事情,这可能会或可能不会影响您。

如果这是一个长时间运行的过程并且您已启用 DEBUG,则需要重置查询,否则它会将您运行的所有查询保留在内存中。

如果您产生大量线程,在每个线程中尽早连接到数据库一次,然后让线程继续运行,您还需要在使用完数据库后关闭连接,或者您可以点击您的数据库的连接限制。

您几乎可以肯定不需要 _rollback_on_exception - 我假设您已在相关代码本身中设置了预期的事务行为。

【讨论】:

  • 我会记住关闭 DEBUG。对于生产,我可能会使用一些 pg 连接池(我使用 postgres)。所以只剩下 _rollback_on_exception。我计划大部分时间都坚持使用 Django 自动提交行为——在这种情况下它会起作用吗?如果需要提供逻辑数据一致性,我只打算使用事务。
猜你喜欢
  • 2015-01-06
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2019-12-04
  • 1970-01-01
相关资源
最近更新 更多