【问题标题】:Why still has "commands out of sync; you can't run this command now" error为什么仍然出现“命令不同步;您现在无法运行此命令”错误
【发布时间】:2015-12-21 17:10:25
【问题描述】:

我正在使用 Python mysqldb 库来连接 mysql db。我有一个带有 4 个工作进程的 Web 服务器,其中有 1 个连接和 1 个光标 到 mysql db。所以每个工作进程都会使用它的连接/游标来执行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】:

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

MySQLdb User Guide 中的“threadSafety”下:

MySQL 协议不能处理使用相同的多个线程 一次连接。一些早期版本的 MySQLdb 使用了锁定 实现 2 的线程安全性。虽然这并不难 使用标准 Cursor 类(它使用 mysql_store_result()),它被 SSCursor (它使用 mysql_use_result();对于后者,您必须确保所有行都有 在可以执行另一个查询之前读取。它进一步 由于事务开始,添加事务变得复杂 当游标执行查询,但在 COMMIT 或 ROLLBACK 时结束 由 Connection 对象执行。两个线程根本不能共享一个 事务进行时的连接,除了不 能够在查询执行期间共享它。这过分 将代码复杂到不值得的地步。

这样做的一般结果是:不要在 线程。这真的不值得你或我的努力,最后, 可能会损害性能,因为 MySQL 服务器运行一个单独的 每个连接的线程。你当然可以做缓存之类的事情 池中的连接,并将这些连接提供给一个线程 时间。如果让两个线程同时使用一个连接, MySQL 客户端库可能会崩溃并死掉。你已经 警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2012-07-19
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多