【发布时间】:2020-01-30 11:52:11
【问题描述】:
情况
我在 Symfony 4.3 中将 Prooph 用于我的 commandbus、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。显然 typehinting 不允许这样做(getWrappedConnection() 返回一个 Connection-interface),但实际的 Doctrine PDOConnection 扩展了 \PDO 如果它确实有效,我愿意在这一点上接受这个hackiness!但是,无济于事,仍然是 2 个连接。
【问题讨论】:
-
我认为问题来自 postgres 本身。如果您运行以下命令会发生什么: REVOKE CONNECT ON DATABASE TARGET_DB FROM public;然后: SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'TARGET_DB';
-
@JessGabriel 我不这么认为,在全新的环境(测试管道)中运行时也会发生这种情况,其中 de 容器 + 数据库是在 docker 中新创建的......正如我所说,当我删除了任何类型的命令,它也不会发生。所以我很确定这是因为 Symfony 的配置组件正在启动所有导致两个数据库连接的服务。
标签: php symfony doctrine prooph doctrine-dbal