最重要的是: 你如何刷新django中的MySQL连接?
跟着一个 MySQL server has gone away
错误我发现了 MySQL文档 和其他来源(这里)建议增加 wait_timeout
MySQL参数。对我来说,这似乎是一种解决方法而不是解决方案。我宁愿保持合理 wait_timeout
并刷新代码中的连接。
错误:
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 64bit
有同样的问题。
我需要了解如何在django中检查MySQLdb连接的连接状态。
我猜它可以实现
try:
cursor.execute(sql)
catch OperationalError:
reconnect
有人有更好的主意吗?
UPDATE
我的决定
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
有同样的问题。
我需要了解如何在django中检查MySQLdb连接的连接状态。
我猜它可以实现
try:
cursor.execute(sql)
catch OperationalError:
reconnect
有人有更好的主意吗?
UPDATE
我的决定
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 make_sure_mysql_usable():
from django.db import connection, connections
# mysql is lazily connected to in django.
# connection.connection is None means
# you have not connected to mysql before
if connection.connection and not connection.is_usable():
# destroy the default mysql connection
# after this line, when you use ORM methods
# django will reconnect to the default mysql
del connections._connections.default
从Django 1.6开始,你可以使用
import django.db
django.db.close_old_connections()
这与adamsmith的答案基本相同,只是它处理多个数据库并且也尊重它 CONN_MAX_AGE
设置。 Django打来电话 close_old_connections()
在每个请求之前和之后自动执行,因此除非在正常的请求/响应周期之外有一些长时间运行的代码,否则通常不必担心它。