首页 > 解决方案 > 是否可以在 lambda_handler 中包含 connect() 以便在使用后关闭连接?

问题描述

我编写了一个 lambda 函数来访问 MySQL 数据库并获取数据,即获取用户数,但不会获取任何实时更新,除非重新建立连接。并且在返回之前关闭 lambda_handler 内部的连接,会在下一次调用时导致连接错误。

我正在使用的查询是->select count(*) from users

import os
import pymysql
import json
import logging

endpoint = os.environ.get('DBMS_endpoint')
username = os.environ.get('DBMS_username')
password = os.environ.get('DBMS_password')
database_name = os.environ.get('DBMS_name')
DBport = int(os.environ.get('DBMS_port'))

logger = logging.getLogger()
logger.setLevel(logging.INFO)
try:
    connection = pymysql.connect(endpoint, user=username, passwd=password, db=database_name, port=DBport)
    logger.info("SUCCESS: Connection to RDS mysql instance succeeded")
except:
    logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")

def lambda_handler(event, context):
    try:
        cursor = connection.cursor()
        ............some.work..........
        ............work.saved..........
        cursor.close()
        connection.close()
        return .....

    except:
        print("ERROR")

上面的代码在第二次使用后导致连接错误,第一次工作正常并给出输出,但第二次运行 lambda 函数时导致连接错误。

删除此行后->

connection.close()

代码工作正常,但插入数据库的实时数据不是由 lambda 获取的,但是当我 2 分钟不使用 lambda 函数时,再次使用它后,它会获取新值.

所以,为了纠正这个问题,我把 connect() 放在了 lambda_handler 里面,问题就解决了,它还在插入时获取了实时数据。

import os
import pymysql
import json
import logging

endpoint = os.environ.get('DBMS_endpoint')
username = os.environ.get('DBMS_username')
password = os.environ.get('DBMS_password')
database_name = os.environ.get('DBMS_name')
DBport = int(os.environ.get('DBMS_port'))

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    try:
        try:
            connection = pymysql.connect(endpoint, user=username, passwd=password, db=database_name, port=DBport)
        except:
            logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
        cursor = connection.cursor()
        ............some.work..........
        ............work.saved..........
        cursor.close()
        connection.close()
        return .....

    except:
        print("ERROR")

所以,我想知道,这样做是否正确,或者有其他方法可以解决这个问题,我试图解决这个问题几天,最后这个解决方案正在工作,但不确定它是否会是一个这样做或不这样做的好习惯。
如果与数据库的连接数增加,会出现任何问题吗?还是任何类型的资源问题?

标签: aws-lambdaamazon-rds

解决方案


推荐阅读