Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-OperationalError:(2006年,MySQL服务器消失了';)_Mysql_Django - Fatal编程技术网

Django-OperationalError:(2006年,MySQL服务器消失了';)

Django-OperationalError:(2006年,MySQL服务器消失了';),mysql,django,Mysql,Django,首先,底线是:如何在django中刷新MySQL连接? 在一个MySQL服务器消失之后错误我发现和其他来源()建议增加wait\u timeoutMySQL参数。对我来说,这似乎是一个解决办法,而不是一个解决方案。我宁愿保持一个合理的等待\u超时并刷新代码中的连接 错误: File "C:\my_proj\db_conduit.py", line 147, in load_some_model SomeModel.objects.update() File "C:\Python2

首先,底线是:如何在django中刷新MySQL连接?

在一个
MySQL服务器消失之后
错误我发现和其他来源()建议增加
wait\u timeout
MySQL参数。对我来说,这似乎是一个解决办法,而不是一个解决方案。我宁愿保持一个合理的
等待\u超时
并刷新代码中的连接

错误:

  File "C:\my_proj\db_conduit.py", line 147, in load_some_model
    SomeModel.objects.update()
  File "C:\Python26\lib\site-packages\django-1.3-py2.6.egg\django\db\models\manager.py", line 177, in update
    return self.get_query_set().update(*args, **kwargs)
  File "C:\Python26\lib\site-packages\django-1.3-py2.6.egg\django\db\models\query.py", line 469, in update
    transaction.commit(using=self.db)
  File "C:\Python26\lib\site-packages\django-1.3-py2.6.egg\django\db\transaction.py", line 142, in commit
    connection.commit()
  File "C:\Python26\lib\site-packages\django-1.3-py2.6.egg\django\db\backends\__init__.py", line 201, in commit
    self._commit()
  File "C:\Python26\lib\site-packages\django-1.3-py2.6.egg\django\db\backends\__init__.py", line 46, in _commit
    return self.connection.commit()
OperationalError: (2006, 'MySQL server has gone away')
设置:Django 1.3.0、MySQL 5.5.14、innodb 1.1.8、Python 2.6.6、Win7 64位都有同样的问题。 我需要知道如何检查django中MySQLdb连接的连接状态。 我想这可以通过

try:
    cursor.execute(sql)
catch OperationalError:
    reconnect
有人有更好的主意吗

更新

我的决定

self.connection.stat()
if self.connection.errno()!=0:
如果重新创建连接时出错,请检查mysqldb连接的状态

再次更新

如果连接关闭,您还需要为案例提供服务

if self.connection.open:
    self.connection.stat()
刷新连接只是重新创建它

    db_settings = settings.DATABASES['mysql_db']
    try:
        self.connection = MySQLdb.connect(host=db_settings['HOST'],port=int(db_settings['PORT']),db=db_settings['NAME'],user=db_settings['USER'],passwd=db_settings['PASSWORD'])
    except MySQLdb.OperationalError, e:
        self.connection = None

解决方案的想法很清楚:如果当前连接中断,请重新连接到mysql

请查看以下内容:

def确保mysql可用()
从django.db导入连接,连接
#mysql在django中惰性地连接到。
#连接不是一种手段
#您以前没有连接过mysql
如果connection.connection和not connection.is可用():
#销毁默认的mysql连接
#在这一行之后,当您使用ORM方法时
#django将重新连接到默认的mysql
删除连接。\u connections.default

自Django 1.6以来,您可以使用

import django.db

django.db.close_old_connections()

这与adamsmith的答案基本相同,只是它处理多个数据库,并且尊重
CONN_MAX_AGE
设置。Django在每次请求前后自动调用
close\u old\u connections()
,因此,除非您有一些超出正常请求/响应周期的长时间运行的代码,否则您通常不必担心它。

导致此异常的主要原因主要是由于mysql服务器上的客户端理想等待超时时间长于
等待超时时间

为了防止这种错误,
django
支持名为
CONN\u MAX\u AGE
的选项,如果旧连接太长,django可以重新创建新连接。 因此,您应该确保
CONN\u MAX\u AGE
值小于
wait\u timout

重要的一点是,
django
with
wsgi
通过调用
close\u old\u connections
来处理检查
CONN\u MAX\u AGE
每个请求。所以你基本上不需要关心这个。但是,如果您在标准应用程序中使用的是
django
,则不存在运行该函数的触发器。所以你必须手动调用它。因此,让我们调用
关闭代码库中的旧连接


注意:
close\u old\u connections
将保留尚未过期的旧连接。在高频查询的情况下,您的连接仍然会被重用

这种方法还可以关闭空闲连接,使事情变得更好

因此,在长时间后需要进行查询之前,运行以下行将起作用:

from django.db import close_old_connections

# To prevent the error if possible.
close_old_connections()
# Then the following sentence should be always ok.
YourModel.objects.all()

如何重新创建连接?这应该是公认的答案。删除连接对象将导致下次运行Django查询时重新创建连接对象,因此在查询之前运行此函数应确保刷新连接。此外,如果要使用字符串名称删除数据库(如果配置了多个数据库),则可以使用“del connections.\u connections.\uuu dict.\uuu['default']”。