当前第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数据库连接丢失的问题解决(示例讲解)的详细内容,更多文章请关注木庄网络博客!!
返回前面的内容
相关阅读 >>
一些centos Python 生产环境的部署命令
Python怎么把数据框内数据写入数据库
Python中pass的作用是什么
Python--aes加密与解密方法指导
Python之实现自定义分页功能
Python解方程的技巧介绍(代码示例)
为什么Python不好找工作
Python程序的两种运行方式是什么
Python类怎么理解
Python怎么安装opencv
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » Django数据库连接丢失的问题解决(示例讲解)