我有两个 lambda 函数,一个将数据插入数据库 (create_user),另一个 (get_users) 从 AWS RDS 上托管的 MySQL 数据库读取数据。
create_user lambda 的数据库代码如下所示(注意提交):
user = ... # get user from request object
with self.conn.cursor() as cursor:
cursor.execute(sql.INSERT_USER, (
user.first_name,
user.last_name,
user.birth_date,
user.sex,
user.firebase_id
))
self.conn.commit()
以及 get_users lambda 的数据库代码:
with self.conn.cursor() as cursor:
cursor.execute(sql.GET_ALL_USERS)
user_rows = cursor.fetchall()
在这两个 lambda 中,我在处理函数之外设置了数据库连接:
conn_params = db_utils.db_connection_parameters()
conn = pymysql.connect(host=conn_params['host'],
user=conn_params['username'],
password=conn_params['password'],
database=conn_params['name'],
cursorclass=pymysql.cursors.DictCursor)
def lambda_handler(event, context):
...
问题在于 get_users lambda 响应不包含最近使用 create_user lambda 或通过 MySQLWorkbench 插入的用户(再次,记住调用
commit
)。如果我使用 pymysql 或 MySQLWorkbench 连接到数据库,我可以看到新行已插入,但 get_users lambda 在另外 10 分钟左右不会反映此更改。我希望结果几乎立即得到反映。
将连接从 lambda 处理函数外部移至其中修复了问题:
conn_params = db_utils.db_connection_parameters()
def lambda_handler(event, context):
user_id = int(event['pathParameters']['id'])
conn = pymysql.connect(host=conn_params['host'],
user=conn_params['username'],
password=conn_params['password'],
database=conn_params['name'],
cursorclass=pymysql.cursors.DictCursor)
我不明白为什么。我一定是误解了数据库连接的工作方式以及它们缓存的内容。