Python 和 Django OperationalError (2006, 'MySQL server has gone away')

标签 python mysql django nginx django-middleware

原文:我最近开始从我的一些旧代码中获取 MySQL OperationalErrors,并且似乎无法追溯问题。由于它以前可以工作,我认为它可能是软件更新破坏了某些东西。我正在将 python 2.7 与 django runfcgi 与 nginx 一起使用。这是我的原始代码:

views.py

DBNAME = "test"
DBIP = "localhost"
DBUSER = "django"
DBPASS = "password"
db = MySQLdb.connect(DBIP,DBUSER,DBPASS,DBNAME)
cursor = db.cursor()

def list(request):
    statement = "SELECT item from table where selected = 1"
    cursor.execute(statement)
    results = cursor.fetchall()

我尝试了以下方法,但还是不行:

views.py

class DB:
    conn = None
    DBNAME = "test"
    DBIP = "localhost"
    DBUSER = "django"
    DBPASS = "password"
def connect(self):
    self.conn = MySQLdb.connect(DBIP,DBUSER,DBPASS,DBNAME)
def cursor(self):
    try:
        return self.conn.cursor()
    except (AttributeError, MySQLdb.OperationalError):
        self.connect()
        return self.conn.cursor()

db = DB()
cursor = db.cursor()

def list(request):
    cursor = db.cursor()
    statement = "SELECT item from table where selected = 1"
    cursor.execute(statement)
    results = cursor.fetchall()

目前,我唯一的解决方法是在每个使用 mysql 的函数中执行 MySQLdb.connect()。我还注意到,当使用 django 的 manage.py runserver 时,我不会遇到这个问题,而 nginx 会抛出这些错误。我怀疑我的连接超时,因为 list() 在启动服务器的几秒钟内被调用。我正在使用的软件是否有任何更新会导致此问题/是否有任何解决方法?

编辑:我意识到我最近编写了一个中间件来守护一个函数,这就是问题的原因。但是,我不知道为什么。这是中间件的代码

def process_request_handler(sender, **kwargs):
    t = threading.Thread(target=dispatch.execute,
        args=[kwargs['nodes'],kwargs['callback']],
        kwargs={})
    t.setDaemon(True)
    t.start()
    return
process_request.connect(process_request_handler)

最佳答案

有时如果您看到“OperationalError: (2006, 'MySQL server has gone away')”,那是因为您发出的查询太大。例如,如果您将 session 存储在 MySQL 中,并且您试图在 session 中放入一些非常大的东西,就会发生这种情况。要解决此问题,您需要增加 MySQL 中 max_allowed_pa​​cket 设置的值。

默认值为 1048576。

所以查看当前值为默认值,运行以下SQL:

select @@max_allowed_packet;

要临时设置新值,请运行以下 SQL:

set global max_allowed_packet=10485760;

要更永久地解决问题,请创建一个至少包含以下内容的/etc/my.cnf 文件:

[mysqld]
max_allowed_packet = 16M

编辑/etc/my.cnf 后,如果你不知道怎么做,你需要重启 MySQL 或重启你的机器。

关于Python 和 Django OperationalError (2006, 'MySQL server has gone away'),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14163429/

相关文章:

python - 在不丢失顺序的情况下消除冗余的 2D 点

python - 将 XML 文件中的所有元素解析为 CSV,无需硬编码值

mysql选择不同的字母,包括扩展的拉丁字符

django - 使用来自 django 应用程序的 kafka 消息

运行在nginx和uwsgi上的django项目中python进程启动需要时间

python - 二维数组的python总和如何返回列表

python - 在不覆盖现有键值对的情况下更新字典?

php - 多文件上传支持所有浏览器,特别是ie7,ie8和ie9

mysql - SQL - 将值递增 1 时设置最大数量

javascript - Django Rest Framework 许多相关领域 - Javascript ajax - 整数列表的正确格式