为什么要缓存对 MySQL RDS 的 AWS Lambda python 调用?
Why is an AWS Lambda python call to a MySQL RDS being cached?
简化我的程序,我有一个 MySQL RDS 数据库,我想开发一个 Lambda 函数来获取插入特定列的最后一个值。
我在 lambda 函数中得到了以下代码,基于 this AWS tutorial:
# Connexion to DB outside the handler, per AWS recomendation
def lambda_handler(event, context):
with conn.cursor() as cur:
cur.execute("SELECT column FROM DB.table ORDER BY create_time DESC LIMIT 1;")
row = cur.fetchone()
return row[0]
我正在使用 pymysql
。
基本上,在第一次调用中(例如,在保存 lambda 函数之后)它按预期工作,并且 return 是 table 中的最后一个值。
但是,对于短时间间隔(几分钟)内的任何其他调用,它会继续 return 相同的值,与任何数据库更改无关。
保存或等待几分钟会得到正确的结果。
有没有可能是我无意中缓存了结果?
解决方案是在每个 Select 查询后使用 conn.autocommit(True)
一次或 conn.commit()
。
使用此选项,每个 select 查询后都会有一个提交。
否则,后续 select 将呈现相同的结果。
这个错误好像是Bug #42197 related to Query cache and auto-commit in MySQL. The status is won't fix! There is also an issue in pymysql但是已经关闭了。
几个月后,这应该是无关紧要的,因为 MySQL 8.0 is dropping Query Cache。
简化我的程序,我有一个 MySQL RDS 数据库,我想开发一个 Lambda 函数来获取插入特定列的最后一个值。
我在 lambda 函数中得到了以下代码,基于 this AWS tutorial:
# Connexion to DB outside the handler, per AWS recomendation
def lambda_handler(event, context):
with conn.cursor() as cur:
cur.execute("SELECT column FROM DB.table ORDER BY create_time DESC LIMIT 1;")
row = cur.fetchone()
return row[0]
我正在使用 pymysql
。
基本上,在第一次调用中(例如,在保存 lambda 函数之后)它按预期工作,并且 return 是 table 中的最后一个值。
但是,对于短时间间隔(几分钟)内的任何其他调用,它会继续 return 相同的值,与任何数据库更改无关。
保存或等待几分钟会得到正确的结果。 有没有可能是我无意中缓存了结果?
解决方案是在每个 Select 查询后使用 conn.autocommit(True)
一次或 conn.commit()
。
使用此选项,每个 select 查询后都会有一个提交。 否则,后续 select 将呈现相同的结果。
这个错误好像是Bug #42197 related to Query cache and auto-commit in MySQL. The status is won't fix! There is also an issue in pymysql但是已经关闭了。
几个月后,这应该是无关紧要的,因为 MySQL 8.0 is dropping Query Cache。