SQLalchemy:Engine/Connection 闲置数小时后断开连接
SQLalchemy: Engine/Connection disconnects after some hours of inactivity
情况
我在 docker 容器中有一个 plotly-dash 应用程序 运行(基于 python3.7-slim
)。
该应用程序正在访问 postgres 数据库并可视化查询的数据。
但是,如果该应用程序有一段时间未使用(我估计大约 24-48 小时。我们在周末没有人使用该应用程序后的星期一首先注意到此问题)即如果没有查询数据从数据库中,应用程序冻结并且日志显示一些与数据库相关的错误。
我无法完全访问日志,但它们包含以下错误:
AttributeError: 'Connection' object has no attribute '_Connection_connection'
下面列出了所有试图从数据库中查询数据的代码片段(但没有说明到底出了什么问题)。
问题总是通过重新启动应用程序解决(因此与数据库建立新连接)
假设
如上所述,这种情况总是 在一段时间不活动后发生。所以我的假设是,引擎在空闲时间后断开连接
代码示例
为了访问数据库,我有一个DatabaseConnection
class。代码的相关部分包含如下内容:
from sqlalchemy import create_engine
...
engine = create_engine(f"postgresql+psycopg2://{user}:{passw}@{url}:{port}/{db_name}")
self.engine = engine.connect()
...
问题
- 克服不活动后断开连接问题的最佳解决方案是什么?
- 我怎么可能检查数据库连接是否仍然有效,如果不是,以某种方式重新连接它?
- 是否有比通过
engine
-对象访问数据库更好的方法?
- 总的来说我的方法有问题吗?
如果您需要更多信息,请告诉我。提前致谢。
我的代码有错误。应该是
self.engine = create_engine(f"postgresql+psycopg2://{user}:{passw}@{url}:{port}/{db_name}")
第二行应该省略。我误解了 engine.connect()
在做什么:它 returns 一个 Connection
对象( 不是 引擎,正如属性名称所暗示的那样)。
然后,对于我执行的每个查询,我使用这样的上下文管理器:
with self.engine.connect() as conn
table1 = pd.read_sql_table("table1", con=conn)
这样,Connection
对象在使用后关闭。但引擎对象可能会在必要时打开新连接。
在我之前的解决方案中,连接在空闲时间后被终止。
(基于此GitHub Discussion)
情况
我在 docker 容器中有一个 plotly-dash 应用程序 运行(基于 python3.7-slim
)。
该应用程序正在访问 postgres 数据库并可视化查询的数据。
但是,如果该应用程序有一段时间未使用(我估计大约 24-48 小时。我们在周末没有人使用该应用程序后的星期一首先注意到此问题)即如果没有查询数据从数据库中,应用程序冻结并且日志显示一些与数据库相关的错误。
我无法完全访问日志,但它们包含以下错误:
AttributeError: 'Connection' object has no attribute '_Connection_connection'
下面列出了所有试图从数据库中查询数据的代码片段(但没有说明到底出了什么问题)。
问题总是通过重新启动应用程序解决(因此与数据库建立新连接)
假设
如上所述,这种情况总是 在一段时间不活动后发生。所以我的假设是,引擎在空闲时间后断开连接
代码示例
为了访问数据库,我有一个DatabaseConnection
class。代码的相关部分包含如下内容:
from sqlalchemy import create_engine
...
engine = create_engine(f"postgresql+psycopg2://{user}:{passw}@{url}:{port}/{db_name}")
self.engine = engine.connect()
...
问题
- 克服不活动后断开连接问题的最佳解决方案是什么?
- 我怎么可能检查数据库连接是否仍然有效,如果不是,以某种方式重新连接它?
- 是否有比通过
engine
-对象访问数据库更好的方法? - 总的来说我的方法有问题吗?
如果您需要更多信息,请告诉我。提前致谢。
我的代码有错误。应该是
self.engine = create_engine(f"postgresql+psycopg2://{user}:{passw}@{url}:{port}/{db_name}")
第二行应该省略。我误解了 engine.connect()
在做什么:它 returns 一个 Connection
对象( 不是 引擎,正如属性名称所暗示的那样)。
然后,对于我执行的每个查询,我使用这样的上下文管理器:
with self.engine.connect() as conn
table1 = pd.read_sql_table("table1", con=conn)
这样,Connection
对象在使用后关闭。但引擎对象可能会在必要时打开新连接。
在我之前的解决方案中,连接在空闲时间后被终止。
(基于此GitHub Discussion)