Django 1.3 随机错误“在查询中与 MySQL 服务器断开连接”
这个讨论串并没有太大帮助:在查询过程中与MySQL服务器失去连接。
我把最大允许的数据包大小(max_allowed_packet)调到了16M,把最大连接数(max_connections)调到了9999。不过,我还是遇到了这个错误:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 107, in _result_iter
self._fill_cache()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 772, in _fill_cache
self._result_cache.append(self._iter.next())
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/query.py", line 273, in iterator
for row in compiler.results_iter():
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 680, in results_iter
for rows in self.execute_sql(MULTI):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql
cursor.execute(sql, params)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 86, in execute
return self.cursor.execute(query, args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg/MySQLdb/cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
OperationalError: (2013, 'Lost connection to MySQL server during query')
这个问题有点随机发生,谁能帮我解释一下吗?
4 个回答
3
我在一个多线程的Python脚本中遇到了完全一样的错误。问题出在把连接ID当作参数传给线程。
当我开始在每个线程内部创建MySQL连接时,这个问题就解决了。
5
这里有一些可能的原因(部分信息来自于 这个链接):
- 由于服务器的负载情况,查询的执行时间比正常情况下要长(也就是随机的),可能超过了服务器的wait_timeout(不太可能)或net_wait_timeout(比较可能)。
- 你在使用一个 SQL 代理,而这个代理在连接还没完成时就把它们杀掉了。
- 你和 MySQL 服务器之间的网络连接不太稳定。可以尝试 ping 一下服务器,看看是否有数据包丢失。
还有一种可能是,查询本身因为缺少索引、数据集太大或者你使用的表引擎(可能是 InnoDB 或 MyISAM)有一些限制,导致它非常耗费资源。要判断这一点,可以找到导致问题的 QuerySet,从中获取原始 SQL 语句(可以参考 如何从 Django QuerySet 获取 SQL),然后在你选择的 MySQL 命令行中运行这个查询,前面加上 EXPLAIN。
-4
解决办法是在相邻的数据库调用之间加一个暂停。