首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当AWS RDS导致连接冻结时更新Postgres上的表

当AWS RDS导致连接冻结时更新Postgres上的表
EN

Stack Overflow用户
提问于 2021-10-19 13:09:52
回答 1查看 28关注 0票数 0

我已经使用亚马逊网络服务大约6个月了,用于一些简单的任务,比如使用EC2设置python脚本和cronjob,更新postgres上的表。到目前为止,一切都很好,但最近在更新表的cronjob增加到20个之后,一切都变得糟糕起来,因此它们之间存在多个冲突,同时尝试连接到数据库修改表(但没有2个脚本尝试同时修改同一个表)。它们开始随机失败,我开始看到大多数失败,我需要重启aws rds实例才能让cronjob正常工作,但同样的事情也会重复发生。正如你在这里看到的,数据库连接一直在增加,一旦我重启它,它就恢复正常了,和当前的活动会话一样(老实说,我想知道它怎么会是一个浮动)。

代码语言:javascript
复制
Error:
Exception: Unexpected exception type: ReadTimeout

我想知道我连接数据库的方式是不是有问题?我甚至不知道RDS会不会因为多次连接尝试而冻结对表的任何修改。问题是,我确信这个脚本可以工作,因为当我停止所有cronjob,重新启动rds实例并运行这个脚本时,它工作得很好,但是当我再次启动所有这些工作时,它就失败了。有没有人可以帮我解决这个问题?

我的大多数脚本看起来都很像下面的脚本,有些脚本每天运行一次,也有5分钟运行一次

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2021-11-22 14:19:26

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

代码语言:javascript
复制
connection = create_engine(DATABASE_URI, echo=False, poolclass=NullPool)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69631433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档