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

回到顶部