为什么还有“命令不同步;您现在不能运行此命令”错误

问题描述 投票:4回答:1

我正在使用Python mysqldb库连接mysql db。我有一个带有4个工作进程的Web服务器,该进程对mysql db具有1 conn和1个游标。因此,每个工作进程都将使用其连接/游标执行sql语句。

现在,我有几个客户端要同时向服务器发送请求,服务器将查询mysql db,并将一些结果返回给客户端。我遇到错误。 2014,“命令不同步;您现在不能运行此命令”我已经检查了sql,它很简单,例如SELECT a, b, c from table WHERE a = 1。没有分号或存储过程,我也尝试按Python, "commands out of sync; you can't run this command now"建议使用以下代码。但是它仍然是同样的错误。

self.cursor.execute(sql, data)
self.conn.commit()
result = result + self.cursor.fetchall()
self.cursor.close()
self.cursor = self.conn.cursor() 
python mysql mysql-python
1个回答
4
投票

最后,我解决了这个问题。我的应用程序具有使用同一连接的多线程,似乎不是访问mysql的正确方法,因此当我不共享连接时,问题就消失了。

MySQLdb User Guide中的“ threadSafety”下:

MySQL协议无法使用同一协议处理多个线程一次连接。 MySQLdb的某些早期版本利用锁定达到2的线程安全性。使用标准的Cursor类(使用mysql_store_result()),由SSCursor(使用mysql_use_result();对于后者,您必须确保所有行都具有在执行另一个查询之前已被读取。更进一步自交易开始以来,由于增加交易而变得复杂当游标执行查询时,但当COMMIT或ROLLBACK为由Connection对象执行。两个线程根本无法共享一个进行交易时的连接,除了没有能够在查询执行期间共享它。这太过分了将代码复杂化到不值得的程度。

一般的结论是:不要共享线程。确实不值得您付出我的努力,最后,这可能会影响性能,因为MySQL服务器运行单独的每个连接的线程。您当然可以做类似缓存的事情池中的连接,并将这些连接分配给一个线程时间。如果让两个线程同时使用连接,MySQL客户端库可能会崩溃。你去过警告。

© www.soinside.com 2019 - 2024. All rights reserved.