утечка соединения может произойти только тогда, когда Лямбда-среда исполнения имеет значение жив ; другими словами, соединение будет timeout (закрыто) после разрушения среды выполнения.
Является ли объект глобального соединения стоящим для реализации , зависит от вашего конкретного варианта использования:
- сколько общего времени выполнения занимает инициализация базы данных
- как часто Ваша функция называется
- как вы обрабатываете ошибки соединения с базой данных
Если вы хотите иметь немного больше контроля над соединением, вы можете попробовать этот подход, который перерабатывает соединение с базой данных каждый раз два часа или при обнаружении исключений , связанных с базой данных :
# Initialize the global object to hold database connection and timestamp
db_conn = {
"db_handle": None,
"init_dt": None
}
def lambda_handler(event, context):
# check database connection
if not db_conn["db_handle"]:
db_conn["db_handle"] = connect_database()
db_conn["init_dt"] = datetime.datetime.now()
# Do something with the database and return the result
try:
result = do_work(db_conn["db_handle"])
except DBError:
try:
db_conn["db_handle"].close()
except:
pass
db_conn["db_handle"] = None
return "db error occured"
# check connection age
if datetime.datetime.now() - db_conn["init_dt"] > datetime.timedelta(hours=2):
db_conn["db_handle"].close()
db_conn["db_handle"] = None
return result
Обратите внимание, что я не проверял вышеупомянутое на Lambda, поэтому вам необходимо проверить его с настройками.