Prooph Eventstore (PDO) 和 Doctrine DBAL 导致多个连接
Prooph Eventstore (PDO) and Doctrine DBAL results in multiple connections
情况
我在 Symfony 4.3 中为我的命令总线、事件总线和事件存储使用 Prooph。由于不是每个聚合都需要事件源,我们还使用 Doctrine DBAL 来简单地 CRUD 那些简单的聚合。
在给定的域中,我在命令总线中配置了命令/处理程序,它们使用事件源存储库或 DBAL 存储库。
将此命令总线注入 CLI 命令时,当 运行 CLI 上的任何内容时,这会导致多个数据库连接。
问题
当尝试 delete/create 数据库(用于原始安装或重置测试环境)时,Postgres 拒绝,因为还有另一个活动连接。
Could not drop database "api" for connection named default
An exception occurred while executing 'DROP DATABASE "api"':
SQLSTATE[55006]: Object in use: 7 ERROR: database "api" is being accessed by other users
DETAIL: There is 1 other session using the database.
- 我尝试禁用所有具有事件源存储库的命令
问题已解决。
- 我尝试禁用所有具有
DBAL 存储库,问题已修复。
- 我尝试不注入此命令总线,问题已解决。
所以我可以安全地得出结论,当结合使用具有 PDO 连接的服务和具有 DBAL 连接的服务时,问题会出现。
解决方案(失败)
我想到的一个解决方案是对 Prooph Eventstore 使用 Doctrine DBAL $connection->getWrappedConnection()
。显然类型提示不允许这样做(getWrappedConnection()
returns 一个 Connection
-接口)但是实际的 Doctrine PDOConnection
extends \PDO
如果它确实有效,我愿意在这一点上接受骇客!但是,没有用,还是2个连接。
MySQLEventStore 的构造函数的第二个参数是 PDO 连接,参见 https://github.com/prooph/pdo-event-store/blob/master/src/MySqlEventStore.php#L82。您可以为 Doctrine 和 EventStore 使用相同的 PDO 实例,但这有点危险,因为您可能会干扰其事务处理。我建议在删除数据库之前关闭测试中的 Doctrine 连接。
简而言之,我使用延迟加载来确保在内核启动期间没有建立实际的数据库连接。一定要 composer require symfony/proxy-manager-bridge
否则你的 lazy: true
将被默默地忽略(因此我一开始认为这不是解决方案)。
情况
我在 Symfony 4.3 中为我的命令总线、事件总线和事件存储使用 Prooph。由于不是每个聚合都需要事件源,我们还使用 Doctrine DBAL 来简单地 CRUD 那些简单的聚合。
在给定的域中,我在命令总线中配置了命令/处理程序,它们使用事件源存储库或 DBAL 存储库。
将此命令总线注入 CLI 命令时,当 运行 CLI 上的任何内容时,这会导致多个数据库连接。
问题
当尝试 delete/create 数据库(用于原始安装或重置测试环境)时,Postgres 拒绝,因为还有另一个活动连接。
Could not drop database "api" for connection named default
An exception occurred while executing 'DROP DATABASE "api"':
SQLSTATE[55006]: Object in use: 7 ERROR: database "api" is being accessed by other users
DETAIL: There is 1 other session using the database.
- 我尝试禁用所有具有事件源存储库的命令 问题已解决。
- 我尝试禁用所有具有 DBAL 存储库,问题已修复。
- 我尝试不注入此命令总线,问题已解决。
所以我可以安全地得出结论,当结合使用具有 PDO 连接的服务和具有 DBAL 连接的服务时,问题会出现。
解决方案(失败)
我想到的一个解决方案是对 Prooph Eventstore 使用 Doctrine DBAL $connection->getWrappedConnection()
。显然类型提示不允许这样做(getWrappedConnection()
returns 一个 Connection
-接口)但是实际的 Doctrine PDOConnection
extends \PDO
如果它确实有效,我愿意在这一点上接受骇客!但是,没有用,还是2个连接。
MySQLEventStore 的构造函数的第二个参数是 PDO 连接,参见 https://github.com/prooph/pdo-event-store/blob/master/src/MySqlEventStore.php#L82。您可以为 Doctrine 和 EventStore 使用相同的 PDO 实例,但这有点危险,因为您可能会干扰其事务处理。我建议在删除数据库之前关闭测试中的 Doctrine 连接。
简而言之,我使用延迟加载来确保在内核启动期间没有建立实际的数据库连接。一定要 composer require symfony/proxy-manager-bridge
否则你的 lazy: true
将被默默地忽略(因此我一开始认为这不是解决方案)。