【问题标题】:Is opening a new MySQL cursor for each query slow?为每个查询打开一个新的 MySQL 游标是否很慢?
【发布时间】:2014-07-24 13:59:09
【问题描述】:

我在这里看到了一些答案,在每个查询之前打开一个新的 MySQL 游标,然后关闭它。

这么慢吗?我不应该通过将游标作为参数传递来回收它吗?

我有一个执行无限循环的程序,因此最终连接将在默认 8 小时后超时。

编辑:

根据要求,这是处理 SQL 查询的相关代码:

def fetch_data(query):
    try:
        cursor = db.Cursor()
        cursor.execute(query)
        return cursor.fetchall()
    except OperationalError as e:
        db = fetchDb()
        db.autocommit(True)
        print 'reconnecting and trying again...'
        return fetch_data(query)

【问题讨论】:

  • 您应该将当前功能识别为性能分析的瓶颈。还有这个问题看起来和你的类似:stackoverflow.com/questions/8099902/…
  • @hd1 谁说基本功能没做好?大功告成,我只是在修复第一个 10k-20k 迭代后出现的 bug,它依赖于这个问题。
  • 张贴你的代码,@macdonjo,拜托...我去看看
  • 我添加了它。不知道它是否会有所帮助。
  • 为什么重新发明 SQLAlchemy 很糟糕?

标签: python mysql


【解决方案1】:

当然,重新连接数千次将花费更多时间。您最好将其设置为您的类的属性,如下所示:

class yourClass():
    self.db = ...
    self.cursor = self.con.Cursor()

    # do something
    def fetch_data(self, query):
        try:
            if self.cursor:
                self.cursor.execute(query)
            else:
                raise OperationalError
            return self.cursor.fetchall()
        except OperationalError as e:
            self.db = fetchDb()
            self.db.autocommit(True)
            print 'reconnecting and trying again...'
            return fetch_data(query)    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 2020-10-24
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多