python-3.x - 当 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()
解决方案
我了解到该错误与创建连接有关,以某种方式使用 ( connection = engine.connect()
) 创建连接会冻结对数据库表的任何其他修改,它通过使用引擎直接作为连接开始为我工作,如下所示:
connection = create_engine(DATABASE_URI, echo=False, poolclass=NullPool)
推荐阅读
- cordova - 即使设置了 httpMethod,cordova-plugin-file-transfer 上传也显示为 GET 请求
- django - 访问调用 celery 任务时传递的额外数据
- python - Python beautifulsoup:删除元素中的特定元素
- qt - QML:如何在 RowAlignment 中均匀分布?
- javascript - CSS / Javascript动画高度为具有不同高度的项目展开和折叠
- java - 如何获取当前选定的项目名称?
- bash - 在 gmake $(shell) 函数中转义 #
- angular - 角度材料输入字段在 mat-list 或 mat-option 中不起作用
- java - 如何使用 Glide 显示不同的图像?
- visual-studio - 如果在 dotnet core 2 中有更多 DbContexts,如何添加迁移?