首页 > 解决方案 > 当 AWS RDS 导致连接冻结时更新 Postgres 上的表

问题描述

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

Error:
Exception: Unexpected exception type: ReadTimeout

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

我的大多数脚本看起来与以下非常相似,有些脚本一天运行一次,也每 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()

标签: python-3.xpostgresqlamazon-web-servicesamazon-rds

解决方案


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

connection = create_engine(DATABASE_URI, echo=False, poolclass=NullPool)
 

推荐阅读