python fetchall()中的MySQL死锁

时间:2016-03-14 14:23:53

标签: python mysql

我在PyCharm中有这个代码。我点击“播放”来运行代码,它工作正常,但如果我点击两次或更多,有时不起作用,程序在行中输入死锁:

f=cnx_cursor1.fetchall()

代码:

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import mysql.connector
import time
tik = time.time()

configDB = {
        'user': '****',
        'password': '****',
        'host': '****',
        'database': '****',
        'raise_on_warnings': True,
        'charset': 'utf8',
        'use_unicode': True,
        'collation': 'utf8_general_ci'
    }

cnx = mysql.connector.connect(**configDB)
cnx_cursor1 = cnx.cursor(dictionary=True)
sql1 = "SELECT E.*, " + \
                   "    ((E.statusNumber & 4278190080) >> 24) as s1, " + \
                   "    ((E.statusNumber & 0016711680) >> 16) as s2, " + \
                   "    ((E.statusNumber & 0000065280) >> 08) as s3, " + \
                   "    ((E.statusNumber & 0000000255) >> 00) as s4 " + \
                   " from EUser as E order by E.user_id, E.project;"
cnx_cursor1.execute(sql1)
print "After Execute:", "{:3.10f}".format(time.time()-tik), "s"
f=cnx_cursor1.fetchall()
print "After Fetch:", "{:3.10f}".format(time.time()-tik), "s"
ret = []
for l in f:
    print "user_id:", l["user_id"], "s1:", l["s1"], "s2:", l["s2"], "s3:", l["s3"], "s4:", l["s4"]
    if l["statusPhoto"] == 0:
        pass
    time.sleep(1)
cnx_cursor1.close()
cnx.close()
print "END:", "{:3.10f}".format(time.time()-tik), "s"

任何人都可以帮助我?

这个问题是MySQL的连接吗?

由于

1 个答案:

答案 0 :(得分:1)

FetchAll策略存在一些问题(我遇到过)

  1. 在通过网络发送到客户端
  2. 之前,您必须等待查询中的所有结果
  3. 它可以使用大量内存。在服务器和客户端上
  4. 客户很少了解事情突然放缓的原因
  5. 以下是我要对此进行问题排查的方法

    1. 发生问题时,使用管理工具访问MySQL实例并查找活动请求。如果你看到了你的要求,它应该能够深入了解为什么这么长时间。也许有行锁?也许你的记忆力不好?也许您的客户停止响应?直到你看,你才会知道。
    2. 使用 FetchOne FetchMany 获取较小批量的行,以便更轻松地进行疑难解答https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-fetchone.html
      {{3} }
    3. 调查您的请求设置超时。也许它被设置为无限(或者你想要人类等待的东西),也许你可以将它设置为较低的数字来强制超时并获得更好的错误信息。
    4. 我希望这会有所帮助