每次执行时,我的heroku postgres psycopg2(python)查询变得越来越慢。任何见解?

时间:2017-07-17 01:04:29

标签: postgresql python-3.x heroku

我在heroku上运行了一个python应用程序,它使用标准的postgresql heroku db($ 50版本)。 db中有4个表。我的应用程序根据我应用程序用户的输入查询主表中的一个主键。

查询起初效果很好然而现在我发现它在大约40-50分钟后变得太慢而没有重启我的dyno。一段时间后,查询将花费2,000毫秒,并在用户面前加载几秒钟。我是编程的新手,这是我的第二个应用程序。我想知道什么会使查询慢慢与时间而不是常量。它们起初非常快。在应用程序中psycopg2的最佳做法是什么,以确保数据库不会挂起?以下是其中一个查询的示例(所有其他查询在整个脚本中都有类似的语法):

if eventText=="Mc3 my champs":
            user=event.source.user_id
            profile= line_bot_api.get_profile(user)
            name=str((profile.display_name))

            cur=None
            try:
                cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

                # get the user's information if it exists
                cur.execute("""SELECT lineid, summoner_name, champ_data FROM prestige_data WHERE lineid = %(lineid)s LIMIT 1""", {"lineid": user})
                rows = cur.fetchall()
                for row in rows:
                    champs = row[2]
                    prestige=(calculate_prestige(champs))
                    champs = json.loads(champs)
                    champsdict=dict.items(champs)
                    champs_sorted=sorted(champsdict, key=lambda student: student[1], reverse=True)
                    l=('\n'.join(map(str,champs_sorted)))
                    hello=str(l).replace('(', '').replace(')', '')
                    yay=str(hello).replace("'", "").replace("'", "")
                    msg=(yay+'\n'+"---------------------------"+'\n'+name+'\n'+"Prestige:"+(str(prestige)))
                    line_bot_api.reply_message(
                        event.reply_token,
                        TextSendMessage(text=msg))

                    break                                             # we should only have one result, but we'll stop just in case
                # The user does not exist in the database already
                else:
                    msg = "Oops! You need to add some champs first. Try 'Mc3 inputchamp'."
                    line_bot_api.reply_message(
                        event.reply_token,
                        TextSendMessage(text=msg))               


            except BaseException:
                if cur is not None:
                    conn.rollback()
            finally:
                if cur is not None:
                    cur.close()

1 个答案:

答案 0 :(得分:0)

虽然我知道我没有很好地解决这个问题(仅编程一个月),但我发现了一个可能导致此问题的问题,需要在此处提供文档。

我怀疑在查询中找不到不正确的数据时会导致并发问题。在这种情况下,我的conn不会在上面的例子中回滚,提交或关闭。

根据psycopg2s文档,甚至需要提交或回滚选择查询,否则事务将成立。这反过来将使你的heroku dyno工作者专注于交易30秒导致h12。因此,请确保在应用程序中提交或回滚每个查询,无论结果如何,以确保您不会获得空闲事务。

我的查询现在很漂亮,但问题仍然存在。我不确定缓慢但肯定会让我的女服务员怠慢。我认为一些辅助过程以某种方式开始于我创建的一个类模块中,它无限期地抓住每个工人,直到他们都专注于导致h12的交易。

如果他们有类似的经历,他们会喜欢有人输入。我不想让cron工作每10分钟重启一次应用程序,以使其自我运作。