Django数据库连接丢失的问题解决(示例讲解)


当前第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可以用来干什么?

Python ide修改背景颜色的教程

Python爬取豆瓣电影数据并且提取值xpath和lxml模块(代码)

Python主要做什么开发

Python的format函数是什么意思

通过游戏闯关来测试自己的Python掌握能力

Python是一种什么类型的编程语言

Python中的def是什么意思

Python中的value是什么

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...