我已经使用亚马逊网络服务大约6个月了,用于一些简单的任务,比如使用EC2设置python脚本和cronjob,更新postgres上的表。到目前为止,一切都很好,但最近在更新表的cronjob增加到20个之后,一切都变得糟糕起来,因此它们之间存在多个冲突,同时尝试连接到数据库修改表(但没有2个脚本尝试同时修改同一个表)。它们开始随机失败,我开始看到大多数失败,我需要重启aws rds实例才能让cronjob正常工作,但同样的事情也会重复发生。正如你在这里看到的,数据库连接一直在增加,一旦我重启它,它就恢复正常了,和当前的活动会话一样(老实说,我想知道它怎么会是一个浮动)。
Error:
Exception: Unexpected exception type: ReadTimeout我想知道我连接数据库的方式是不是有问题?我甚至不知道RDS会不会因为多次连接尝试而冻结对表的任何修改。问题是,我确信这个脚本可以工作,因为当我停止所有cronjob,重新启动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()发布于 2021-11-22 14:19:26
我了解到这个错误与创建连接有关,不知何故使用(connection = engine.connect())创建连接冻结了对数据库表的任何其他修改,它通过直接使用引擎作为连接开始为我工作,如下所示:
connection = create_engine(DATABASE_URI, echo=False, poolclass=NullPool)https://stackoverflow.com/questions/69631433
复制相似问题