djangodbreconnect
Django 数据库连接
被动连接只有用时才建立.连接存储在connections 对象里。
普通 request 请求时数据库连接如何管理
signals.request_started.connect(close_old_connections)signals.request_finished.connect(close_old_connections)
为啥会出现2006,2013问题
正常情况: MySQL最长的socket连接时间为8个小时。
超过时间,就会断开。断开就出现2006问题。
不正常情况:
人为从MySQL删除连接。也会出现2006问题。
2013 问题有许多解释:比如数据库文件打开过多。
应对方式
仿照request处理方式。定期做数据库连接关闭。
脚本型,可以自己处理。Django + celery
from django.db import close_old_connections
from celery.signals import task_prerun
from celery.signals import task_postrun
task_prerun.connect(close_old_connections)
task_postrun.connect(close_old_connections)
对底层进行改造
捕获2006,2013异常。进行重新建立数据库连接。再次执行数据库相关命令。
此处重写了mysql的DatabaseWrapper的_cursor方法
# -*- coding: utf-8 -*-# @Time : 2019-12-24 11:18
import logging
from django.db.backends.mysql.base import DatabaseWrapper as MysqlWrapper
logger = logging.getLogger(__name__)
class DatabaseWrapper(MysqlWrapper):
def _cursor(self, *args, **kwargs):
"""
检查连接看是否可用,不可用就关闭,后面django会重新连接
"""
if self.connection:
if not self.is_usable():
logger.info("django db conn is usable, close and reconnect!")
self.connection.close()
self.connection = None
return super(DatabaseWrapper, self)._cursor(*args, **kwargs)
使用,在setting配置文件里更改ENGINE即可
env.DB_SCHEMES["mysql"] = "common.db_retry.backends.mysql"DATABASES = {
"default": env.db_url("DB_URL")
}
# 由于我使用了django-environ,无法直接修改,故env.DB_SCHEMES["mysql"] = "common.db_retry.backends.mysql"方式修改了下
以上是 djangodbreconnect 的全部内容, 来源链接: utcz.com/z/512010.html