当AWS RDS导致连接冻结时,在Postgres上更新表



我已经使用AWS大约6个月了,用于一些简单的任务,如使用EC2设置python脚本和cronjob,更新postgres上的表。到目前为止一切都很好,但最近一切都变得很糟糕,因为更新表的cronjob增加到20个,所以有多个冲突,它们同时试图连接到数据库修改表(但是没有两个脚本试图同时修改同一个表)。它们开始随机失败,我开始看到它们中的大多数失败,我需要重新启动aws rds实例以使cronjobs正常工作,但同样的事情再次重复。正如你在这里看到的,数据库连接不断增加,一旦我重新启动它,它就恢复正常了,与当前的活动会话一样(想知道它怎么可能是一个浮动)

Error:
Exception: Unexpected exception type: ReadTimeout

我想知道我连接到数据库的方式是问题还是什么?由于许多连接尝试,我甚至无法弄清楚RDS是否采取了一些措施来冻结对表的任何修改。问题是,我确信脚本可以正常工作,因为当我停止所有cronjobs、重新启动rds实例并运行此脚本时,它可以正常工作,但是当我再次启动所有cronjobs时,它就失败了。有没有人能帮我弄清楚这个问题?

我的大多数脚本看起来非常类似于下面,有脚本一天运行一次,每5分钟运行一次

def get_daily_data(coin, start_date, time_period):
return df
def main():
coin1 = 'bitcoin'
time_period = '1d'

DATABASE_URI = f'postgresql+psycopg2://{USR}:{token}@{ENDPOINT}:{PORT}/{DBNAME}'
engine = create_engine(DATABASE_URI, echo=False, poolclass=NullPool)
connection = engine.connect()    
if connection is not None:
old_btc_data = pd.read_sql("SELECT * FROM daily_data", connection)
start_date= str(old_btc_data['datetime'].iloc[-1].date() - datetime.timedelta(days=7))
latest_data_btc = get_daily_data(coin1, start_date, time_period)
if latest_data_btc is not None:
try:
latest_data_btc = latest_data_btc.reset_index()
latest_data_btc['datetime'] = latest_data_btc['datetime'].dt.tz_localize(None)
latest_data_btc = pd.concat([old_btc_data, latest_data_btc], ignore_index=True)
latest_data_btc = latest_data_btc.drop_duplicates(keep='last')
latest_data_btc = latest_data_btc.set_index('datetime')
latest_data_btc.to_sql(daily_data, if_exists='replace', con=connection)
print(f"Pushed BTC daily data to the database")
except:
print(f"BTC daily data to the database update FAILED!!!!!!")

connection.close()
if __name__ == '__main__':
main()

我了解到错误与创建连接有关,以某种方式使用(connection = engine.connect())创建连接冻结对数据库表的任何其他修改,它开始通过使用引擎直接作为连接为我工作,如下所示:

connection = create_engine(DATABASE_URI, echo=False, poolclass=NullPool)
编辑:最好使用带有psycopg2游标的会话,异常处理将很容易。