Django-OperationalError:(2006年,MySQL服务器消失了';)
首先,底线是:如何在django中刷新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
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
withwsgi
通过调用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']”。