Prooph Eventstore (PDO) 和 Doctrine DBAL 导致多个连接



情况

我在Symfony 4.3中使用Prooph作为我的命令总线,eventbus和eventstore。由于并非每个聚合都需要事件源,因此我们还使用 Doctrine DBAL 来简单地对这些简单聚合进行 CRUD。

在给定的域中,我在我的命令总线中配置了命令/处理程序,这些命令/处理程序使用事件源存储库或 DBAL 存储库。

将此命令总线注入 CLI 命令时,这会导致在 CLI 上运行任何内容时出现多个数据库连接。

问题

尝试删除/创建数据库(用于原始安装或重置测试环境(时,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连接的服务结合使用时,问题会出现。

解决方案(失败(

我想要的一个解决方案是将 Doctrine DBAL$connection->getWrappedConnection()用于 Prooph Eventstore。显然,键入提示不允许这样做(getWrappedConnection()返回一个Connection接口(,但实际的教义PDOConnection扩展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将被默默忽略(因此我一开始认为这不是解决方案(。

最新更新