当前第2页 返回上一页
1 2 3 4 5 6 7 8 9 10 | DATABASES = {
"default" : {
'ENGINE' : 'django.db.backends.mysql' ,
'NAME' : '' ,
'USER' : '' ,
'PASSWORD' : '' ,
'HOST' : '' ,
'CONN_MAX_AGE' : 9 # 比wait_timeout小一些
}
}
|
当我们测试后却发现,事情并非想想中那么简单。为何错误依旧出现?这一切的背后, 是人性的扭曲还是道德的沦丧?敬请收看下节《突破》。
突破
对django源码中CONN_MAX_AGE
进行了一番搜索,顺藤摸瓜发现了django关闭失效连接的方法django.db.close_old_connections()
:
1 2 3 4 5 6 7 8 | # Register an event to reset transaction state and close connections past
# their lifetime.
def close_old_connections(**kwargs):
for conn in connections.all():
conn.close_if_unusable_or_obsolete()
signals.request_started.connect(close_old_connections)
signals.request_finished.connect(close_old_connections)
|
重点在最后两行,通过signal实现特定事件时执行此方法,两个特定事件顾名思义是请求开始和请求结束。而我们报错的是在一次请求中,所以此法通常无效,仅仅是实现每个请求关闭并重新建立连接。
解决
复现问题的django shell不要关闭,继续执行如下代码:
1 2 3 4 | In[5]:from django.db import close_old_connections
In[6]:close_old_connections()
In[7]:list(User.objects.filter(id=1))
Out[7]: [<User: admin>]
|
调用django.db.close_old_connections后再次查询就没有错误了。
那么我们要避免此错误就要执行每个数据库查询前调用django.db.close_old_connections方法。
1、一般情况不会出现此类问题,因为一个请求中不间断进行数据库查询,无需每个请求调用此方法,杞人忧天。
2、有时候一个请求中数据量较大,会查询数据库后进行一段时间其他(不涉及数据库)处理,比如先查询一些数据,然后将数据处理、生成excel、保存文件并生成url。已知此过长需要非常长时间,那么最终url保存数据库就最好先调用django.db.close_old_connections防止连接丢失。
以上就是Django数据库连接丢失的问题解决(示例讲解)的详细内容,更多文章请关注木庄网络博客!!
返回前面的内容
相关阅读 >>
如何调用Python中的内置函数?(实例解析)
Python如何使用getpass库读取密码的方法介绍
Python实现对文件中图片生成带标签的txt文件方法
Python虚拟机是什么
Python用什么编译器
怎么查看Python安装路径
Python面向对象中高级-异常处理
Python使用dir函数查看类中所有成员的方法介绍
Python中xlsxwriter模块简介与用法分析
Python中property函数的简单介绍
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » Django数据库连接丢失的问题解决(示例讲解)