问题

数据库链接丢失异常

django.db.utils.OperationalError: (2013, 'Lost connection to MySQL server during query')

查询mysql全局变量SHOW GLOBAL VARIABLES;可以看到wait_timeout,此变量表示连接空闲时间,MySQL默认的时间是8小时。如果客户端使用一个连接查询多次数据库,如果连续查询则没有问题,如果查询几次后停顿超过wait_timeout后再次查询就会出现数据库连接丢失

Django中的数据库连接

Django程序接受到请求之后,在第一访问数据库的时候会创建一个数据库连接,直到请求结束,关闭连接。下次请求也是如此。因此,这种情况下,随着访问的并发数越来越高,就会产生大量的数据库连接。即,没收到一次请求,django就会建立一个数据库连接

解决方案:

方案一:(不一定能解决)

使用CONN_MAX_AGE减少数据库请求

每次请求都会创建新的数据库连接,这对于高访问量的应用来说完全是不可接受的。因此在Django1.6时,提供了持久的数据库连接,通过DATABASE配置上添加CONN_MAX_AGE来控制每个连接的最大存活时间。具体使用可以参考最后的链接。

原理:

在每次创建完数据库连接之后,把连接放到一个Theard.local的实例中。在request请求开始结束的时候,打算关闭连接时会判断是否超过CONN_MAX_AGE设置这个有效期。这是关闭。每次进行数据库请求的时候其实只是判断local中有没有已存在的连接,有则复用。

Django中对于CONN_MAX_AGE的使用是有些限制的,使用不当,会事得其反。因为保存的连接是基于线程局部变量的,因此如果你部署方式采用多线程,必须要注意保证你的最大线程数不会多余数据库能支持的最大连接数。如果使用开发模式运行程序(直接runserver的方式),建议不要设置CONN_MAX_AGE,因为这种情况下,每次请求都会创建一个Thread。同时如果你设置了CONN_MAX_AGE,将会导致你创建大量的不可复用的持久的连接。

CONN_MAX_AGE设置多久

CONN_MAX_AGE的时间怎么设置主要取决于数据库对空闲连接的管理,比如你的MySQL设置了空闲1分钟就关闭连接,那你的CONN_MAX_AGE就不能大于一分钟。

具体解决

# django项目中 settings.py

DATABASES = {

"default": {

'ENGINE': 'django.db.backends.mysql',

'NAME': '',

'USER': '',

'PASSWORD': '',

'HOST': '',

'CONN_MAX_AGE': 9*60 # 比wait_timeout小一些

}

}

方案二:

django关闭连接流程

对django源码中CONN_MAX_AGE对django关闭失效连接的方法django.db.close_old_connections():

# 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实现特定事件时执行此方法(类似于 触发器),两个特定事件是请求开始和请求结束。

如果报错的是在一次请求中,所以此法通常无效,仅仅是实现每个请求关闭并重新建立连接。

解决原理:

在每一次查询操作前,通过调用close_old_connections()主动关闭闲置连接,主动关闭闲置连接,当再次操作数据库,会自动建立新的连接。

一般情况不会出现此类问题,因为一个请求中不间断进行数据库查询,无需每个请求调用此方法。

有时候一个请求中数据量较大,会查询数据库后进行一段时间其他(不涉及数据库)处理,比如先查询一些数据,然后进行超过MySQL的wait_timeout的长时间的操作。经过非常长时间,那么请求时建立的连接conn_1已经被MySQL断开,而在项目中在经过长时间的操作后却仍然使用conn_1,就会抛出异常,应该调用django.db.close_old_connections关闭无效连接,重新连接MySQL,在操作数据库,防止连接丢失

具体方法

from django.db import close_old_connections

def func(request):

models.User.objects.filter(name='xxx')

time.sleep(9*60*60)# 模拟执行长时间耗时操作,时间超过MySQL的 wait_timeout

close_old_connections()# 先手动关闭无效时间

models.User.objects.filter(name='xxx')# 再进行查询

django mysql连接超时设置_坑(一)—— Django ORM 连接超时的坑相关推荐

  1. python django mysql写入中文乱码_解决django 向mysql中写入中文字符出错的问题

    之前使用django+mysql建立的一个站点,发现向数据库中写入中文字符时总会报错,尝试了修改settings文件和更改数据表的字符集后仍不起作用.最后发现,在更改mysql的字符集后,需要重建数据 ...

  2. 易语言 mysql查询 中文乱码_大佬们E语言连接MYSQL输出中文乱码怎么破

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 .版本 2 .支持库 mysql .支持库 iext .程序集 窗口程序集_启动窗口 .子程序 _按钮1_被单击 数据库连接句柄 = 连接MySql (& ...

  3. mysql连接access失败_我用工具怎么连接不上mysql数据库的? MySql access denied for user错误...

    MySql access denied for user错误 方法/步骤 MySql远程连接时的"access denied for user **@**"错误,搞的我很头大,后来 ...

  4. netty socket超时设置_彻底搞懂 netty 线程模型

    编者注:Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo.Rocketmq.Hadoop等.本文就netty线程模型展开 ...

  5. android计步器摘要,【使用总结】蓝牙|连接|步数|设置_摘要频道_什么值得买

    使用总结(蓝牙|连接|步数|设置) 这款手表具备了记步.睡眠及心率功能.前两项算是很普遍的功能了,而心率功能现在一些智能穿戴设备上也渐渐多了起来.那这款手表的使用及表现到底如何呢?那接下来就看一下. ...

  6. mysql版本链图解_图解 SQL 中各种连接 JOIN

    先用文字来捋一下思路,数据库操作中无非就是「增删查改」,其中「 查」用得最多且最复杂,变化多端.查询的时候,我们可以只是单表查询,也可以是多表连接查询,单表查询中的学问也很大,但限于篇幅,本次主要分享 ...

  7. 机械键盘连键测试软件,【机械键盘 ROG Strix ScopeAPP体验】监测|连接|控制|设置_摘要频道_什么值得买...

    机械键盘 ROG Strix ScopeAPP体验(监测|连接|控制|设置) 首先是官方的"享睡Sleepace"APP,打开APP后会引导连接产品,通过界面设计,可以看出香薰灯的 ...

  8. 怎么获取mysql的链接字符串_如何从数据库获取连接字符串

    小编典典 获取连接字符串的最简单方法是使用Visual Studio中的"服务器资源管理器"窗口(菜单 视图 , 服务器资源管理器 ),然后从该窗口连接到服务器. 然后,您可以在已 ...

  9. mysql 外键设置_详解MySQL外键设置

    MySQL外键设置是学习MySQL数据库过程中不能不提的,下面就会为您详细介绍MySQL外键设置的方法,希望对您学习MySQL外键设置方面能有所帮助. 外键的作用: 保持数据一致性,完整性,主要目的是 ...

最新文章

  1. SQLSERVER字符串截取------STUFF
  2. linux目录形式,linux 系统下 ngnix 显示目录形式
  3. 解决 An invalid domain was specified for this cookie
  4. seata实现分布式事务解决方案
  5. c+ socket编程
  6. PyTorch:损失函数loss function
  7. 发电厂及电力系统类毕业论文文献都有哪些?
  8. js中文乱码解决方法
  9. 如何使用python将数据写入txt文件
  10. java转行能做什么_java转行可以做什么?应该如何去考虑?
  11. 新手如何做抖音直播带货?新号如何快速获取直播推荐流量?
  12. 高项论文(进度管理2)
  13. Linux查看最近开关机记录
  14. 如何隐藏电脑里的文件或者文件夹?
  15. 用rtl8139网卡制作的bios编程器(不用并口)
  16. 用c语言向无盘符分区拷文件,用GHOST软件将PC硬盘上C分区制作成映象文件﹡.gho的步骤...
  17. java mongodb avg_Java-mongodb-AggregationOutput(分组、统计)
  18. 【重磅】清华大学法学院教授何海波:以数据推动法治(视频+PPT)
  19. VSCode:python import下载的第三方库,报错问题解决
  20. 影石创新IPO被暂缓审议,科创板上市委质疑其可能存在董事会僵局

热门文章

  1. 一行代码,搞定浏览器数据库 IndexedDB
  2. 你应该使用Java8 非阻塞异步API来优化你的系统了
  3. 程序员编码时都戴耳机?到底在听什么?
  4. 每日一皮:传说中的 10 大口头禅,你说过几个?
  5. HTML 转 PDF 新姿势
  6. 微服务之旅:从 Netflix OSS 到 Istio Service Mesh
  7. PS修改过图片上传服务器,富文本编辑器图片上传base64存数据库改为服务器图片路径...
  8. python atm作业详解_Python ATM功能实现代码实例
  9. 约瑟夫生死环游戏c语言程序,使用C++实现的约瑟夫生死游戏
  10. linux创建隐藏进程6,在Linux 2.6内核下实现进程隐藏