我在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()
答案 0 :(得分:0)
虽然我知道我没有很好地解决这个问题(仅编程一个月),但我发现了一个可能导致此问题的问题,需要在此处提供文档。
我怀疑在查询中找不到不正确的数据时会导致并发问题。在这种情况下,我的conn不会在上面的例子中回滚,提交或关闭。
根据psycopg2s文档,甚至需要提交或回滚选择查询,否则事务将成立。这反过来将使你的heroku dyno工作者专注于交易30秒导致h12。因此,请确保在应用程序中提交或回滚每个查询,无论结果如何,以确保您不会获得空闲事务。
我的查询现在很漂亮,但问题仍然存在。我不确定缓慢但肯定会让我的女服务员怠慢。我认为一些辅助过程以某种方式开始于我创建的一个类模块中,它无限期地抓住每个工人,直到他们都专注于导致h12的交易。
如果他们有类似的经历,他们会喜欢有人输入。我不想让cron工作每10分钟重启一次应用程序,以使其自我运作。