Jer*_*ain 5 python mysql mysql-python
我正在使用 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,“命令不同步;您现在无法运行此命令”建议。但它仍然是同样的错误。
self.cursor.execute(sql, data)
self.conn.commit()
result = result + self.cursor.fetchall()
self.cursor.close()
self.cursor = self.conn.cursor()
Run Code Online (Sandbox Code Playgroud)
最后,我解决了这个问题。我的应用程序有多线程来使用相同的连接,这似乎不是访问 mysql 的正确方法,所以当我不共享连接时,问题就消失了。
在MySQLdb 用户指南中的“ threadSafety”下:
MySQL 协议不能同时处理使用同一个连接的多个线程。MySQLdb 的一些早期版本利用锁定来实现 2 的线程安全性。虽然使用标准 Cursor 类(使用 mysql_store_result())来实现这一点并不是非常困难,但 SSCursor(使用 mysql_use_result();使用后者您必须确保在执行另一个查询之前已读取所有行。添加事务会进一步复杂化,因为事务在游标执行查询时开始,但在 Connection 对象执行 COMMIT 或 ROLLBACK 时结束。两个除了在查询执行期间无法共享之外,线程在事务进行时根本无法共享连接。
这样做的一般结果是:不要在线程之间共享连接。这真的不值得你或我的努力,最终可能会损害性能,因为 MySQL 服务器为每个连接运行一个单独的线程。您当然可以在池中缓存连接,并将这些连接一次分配给一个线程。如果让两个线程同时使用一个连接,MySQL 客户端库可能会崩溃并死亡。你被警告了。