我使用Python mysqldb库来连接mysql db。我有一个带有4个工作进程的Web服务器,它具有 1个conn和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()
答案 0 :(得分:3)
最后,我解决了这个问题。我的应用程序有多线程使用相同的连接,似乎不是访问mysql的正确方法,所以当我不共享连接时,问题就消失了。
MySQL协议无法使用相同的处理多个线程 立刻连接。一些早期版本的MySQLdb使用了锁定 实现2的线程安全。虽然这不是非常难 完成使用标准的Cursor类(使用 mysql_store_result()),由SSCursor复杂化(使用 了mysql_use_result();对于后者,您必须确保所有行都有 在执行另一个查询之前已被读取。它是进一步的 由于交易开始,因此增加了交易 当游标执行查询时,但在COMMIT或ROLLBACK结束时结束 由Connection对象执行。两个线程根本无法共享一个 事务正在进行中的连接,除此之外 能够在查询执行期间共享它。这个过分了 将代码复杂化到不值得的地步。
这样做的一般结果是:不要分享之间的联系 线程。这真的不值得你的努力或我的努力,最后, 可能会损害性能,因为MySQL服务器单独运行 每个连接的线程。你当然可以做像缓存这样的事情 池中的连接,并将这些连接提供给a处的一个线程 时间。如果让两个线程同时使用连接,那么 MySQL客户端库可能会崩溃并死掉。你去过 警告。