仅使用Django ORM时的数据库连接管理
我正在使用Django的ORM(对象关系映射)层,但并不是在Django框架内,而是在一个自己开发的网络应用程序中。
我已经成功地让Django的ORM独立运行,没有遇到什么问题。不过,我对连接管理有点担心。我在StackOverflow上看过一篇关于只使用Django数据库部分的文章,里面提到Django在每次请求的开始和结束时会进行一些特殊的连接处理。从Django的代码中可以看到:
# 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)
如果我不进行这些连接管理,会遇到什么问题呢?(我没有简单的方法把这些信号接入我的框架)
1 个回答
1
这要看你具体的使用情况。每个函数都有它特定的功能,这些功能可能会影响到你,也可能不会。
如果你在做一个长时间运行的任务,并且开启了调试模式(DEBUG),那么你需要重置查询,否则它会把你运行过的所有查询都保存在内存里。
如果你创建了很多线程,建议在每个线程开始时就连接数据库,然后让这些线程继续运行。当你用完数据库后,也要记得关闭这些连接,不然可能会达到数据库的连接限制。
你几乎肯定不需要使用 _rollback_on_exception 这个选项——我想你在相关代码里已经设置好了你想要的事务行为。