使 SQLAlchemy 会话保持活动状态 GCP/Spanner
Keeping SQLAlchemy sessions alive to GCP/Spanner
tl;dr:尝试使 Spanner (GCP) 的会话保持活动状态是否是个好主意(我认为它不是,fwiw),如果是这样,关于如何配置 SQLAlchemy 的一些建议是什么engine/sessionmaker要做到这一点?
多年来,我们一直在使用 SQLAlchemy 处理非常小的数据库,采用经典设置 - 本地托管。在其中,我们基本上存储了有关用户的 RBAC 相关数据,以便我们可以即时确保用户会话有权访问某些端点。这非常有效,并且由于数据库是本地的,因此长时间保持会话打开效果很好。在连网 issues/closed 个套接字的情况下,我们只是捕获异常并打开一个新会话,将 old/stale 个返回到池中。
我最近开始使用 spanner,并且正在为其使用开发中的 SQLAlchemy 方言(它运行良好)。然而,所有连接都是 gRPC 到谷歌云,因此会话在 10 秒后超时。重新创建会话的成本似乎相当高(等待 [2-3 秒] 启动的时间很长)。这显然是有意为之的行为,但我想知道我是否遗漏了 Spanner 的会话管理,或者这是否是一个试图确保 sqlalchemy 保持会话活动的用例。
鉴于 gRPC 会话的预期性质,我是否只是忽略了导致会话创建过程中如此长时间延迟的问题? 运行 通过 CLI 进行的手动查询具有同样的问题是初始查询的长时间延迟。有问题的数据集是四个表,大小为 KB,因此这不是复杂性或数据大小问题。
我想澄清一个我注意到的困惑:Cloud Spanner 会话不是事务。
一个 Spanner 会话代表一个与 Cloud Spanner 数据库服务的通信通道,一次可以执行一个事务。正如您正确指出的那样,创建新会话的成本很高,这就是我们缓存会话以便在客户端库的会话池中重用的原因。但是,会话只有在一小时不活动后才会被清理。
可以在此处找到有关 Spanner 会话管理的更多信息:
https://cloud.google.com/spanner/docs/sessions#performance_benefits_of_a_session_cache
Spanner 事务在 10 秒不活动后中止。这是因为事务锁定了整个table。可以通过定期执行 SELECT 1
来避免这种情况,但是不建议这样做,除非您了解保持事务打开的缺点。
请注意,我们有一个 Cloud Spanner SQLAlchemy 方言,目前处于预览状态,可在此处找到:
https://github.com/cloudspannerecosystem/python-spanner-sqlalchemy
tl;dr:尝试使 Spanner (GCP) 的会话保持活动状态是否是个好主意(我认为它不是,fwiw),如果是这样,关于如何配置 SQLAlchemy 的一些建议是什么engine/sessionmaker要做到这一点?
多年来,我们一直在使用 SQLAlchemy 处理非常小的数据库,采用经典设置 - 本地托管。在其中,我们基本上存储了有关用户的 RBAC 相关数据,以便我们可以即时确保用户会话有权访问某些端点。这非常有效,并且由于数据库是本地的,因此长时间保持会话打开效果很好。在连网 issues/closed 个套接字的情况下,我们只是捕获异常并打开一个新会话,将 old/stale 个返回到池中。
我最近开始使用 spanner,并且正在为其使用开发中的 SQLAlchemy 方言(它运行良好)。然而,所有连接都是 gRPC 到谷歌云,因此会话在 10 秒后超时。重新创建会话的成本似乎相当高(等待 [2-3 秒] 启动的时间很长)。这显然是有意为之的行为,但我想知道我是否遗漏了 Spanner 的会话管理,或者这是否是一个试图确保 sqlalchemy 保持会话活动的用例。
鉴于 gRPC 会话的预期性质,我是否只是忽略了导致会话创建过程中如此长时间延迟的问题? 运行 通过 CLI 进行的手动查询具有同样的问题是初始查询的长时间延迟。有问题的数据集是四个表,大小为 KB,因此这不是复杂性或数据大小问题。
我想澄清一个我注意到的困惑:Cloud Spanner 会话不是事务。
一个 Spanner 会话代表一个与 Cloud Spanner 数据库服务的通信通道,一次可以执行一个事务。正如您正确指出的那样,创建新会话的成本很高,这就是我们缓存会话以便在客户端库的会话池中重用的原因。但是,会话只有在一小时不活动后才会被清理。
可以在此处找到有关 Spanner 会话管理的更多信息: https://cloud.google.com/spanner/docs/sessions#performance_benefits_of_a_session_cache
Spanner 事务在 10 秒不活动后中止。这是因为事务锁定了整个table。可以通过定期执行 SELECT 1
来避免这种情况,但是不建议这样做,除非您了解保持事务打开的缺点。
请注意,我们有一个 Cloud Spanner SQLAlchemy 方言,目前处于预览状态,可在此处找到: https://github.com/cloudspannerecosystem/python-spanner-sqlalchemy