Situation
在Symfony 4.3中,我使用Prooph作为命令总线、事件总线和事件存储。由于并非每个聚合都需要事件源,所以我们还使用Doctrine来简单地CRUD那些简单的聚合。
在给定的域中,命令总线中配置了命令/处理程序,这些命令/处理程序使用事件源存储库或DBAL存储库。
当将此命令注入CLI命令时,在CLI上运行任何操作时都会产生多个db连接。
问题
在尝试删除/创建数据库时(用于原始安装或重置测试环境),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.因此,我可以安全地得出结论,当将带有PDO连接的服务与带有DBAL连接的服务结合使用时,问题就会出现。
解决方案(失败)
我想到的一个解决方案是为Prooph使用Doctrine $connection->getWrappedConnection()。显然,键入暗示不允许这样做(getWrappedConnection()返回一个Connection-interface),但是实际的DoctrinePDOConnection扩展了\PDO,如果它确实有效的话,我愿意接受这个问题!然而,没有效果,仍然有两个连接。
发布于 2019-10-04 07:06:49
简而言之,我使用延迟加载来确保在内核引导期间没有建立实际的DB连接。只需确保composer require symfony/proxy-manager-bridge,否则您的lazy: true将被忽略(因此,我认为它不是最初的解决方案)。
发布于 2019-10-01 21:40:45
MySQLEventStore的构造函数的第二个参数是PDO连接,参见https://github.com/prooph/pdo-event-store/blob/master/src/MySqlEventStore.php#L82。您可以为Doctrine和EventStore使用相同的PDO实例,但这有点危险,因为您可能会干扰它的事务处理。我建议在删除数据库之前关闭测试中的Doctrine连接。
https://stackoverflow.com/questions/58180534
复制相似问题