Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Prooph事件存储(PDO)和DBAL导致多个连接_Php_Symfony_Doctrine_Prooph_Doctrine Dbal - Fatal编程技术网

Php Prooph事件存储(PDO)和DBAL导致多个连接

Php Prooph事件存储(PDO)和DBAL导致多个连接,php,symfony,doctrine,prooph,doctrine-dbal,Php,Symfony,Doctrine,Prooph,Doctrine Dbal,形势 我在symfony4.3中使用Prooph作为commandbus、eventbus和eventstore。因为不是每个聚合都需要事件源,所以我们还使用DBAL来简单地对这些简单聚合进行CRUD 在给定域中,我在commandbus中配置了使用eventsourced存储库或DBAL存储库的命令/处理程序 将此commandbus注入CLI命令时,在CLI上运行任何操作时,都会导致多个db连接 问题 当尝试删除/创建数据库(用于原始安装或重置测试环境)时,Postgres拒绝,因为存在另一

形势

我在symfony4.3中使用Prooph作为commandbus、eventbus和eventstore。因为不是每个聚合都需要事件源,所以我们还使用DBAL来简单地对这些简单聚合进行CRUD

在给定域中,我在commandbus中配置了使用eventsourced存储库或DBAL存储库的命令/处理程序

将此commandbus注入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.
  • 我尝试禁用所有具有EventSource存储库的命令 问题已经解决了
  • 我尝试禁用所有具有 DBAL存储库,该问题已修复
  • 我试着不注射这个命令总线,问题已经解决了
因此,我可以有把握地得出结论,当使用带有PDO连接的服务与带有DBAL连接的服务组合时,问题会出现

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.
解决方案(失败)


我想到的一个解决方案是对Prooph Eventstore使用DBAL
$connection->getWrappedConnection()
。显然,类型暗示不允许这样做(
getWrappedConnection()
返回一个
连接
-接口),但实际的原则是
PDOConnection
扩展了
\PDO
,如果它真的起作用,我愿意接受这一点!但是,仍然有2个连接无效。

MySQLEventStore构造函数的第二个参数是PDO连接,请参阅。您可以将相同的PDO实例用于Doctrine和EventStore,但这有点危险,因为您可能会干扰其事务处理。我建议在删除数据库之前关闭测试中的条令连接。

简而言之,我使用延迟加载来确保在内核引导期间没有实际的数据库连接。只需确保
composer需要symfony/proxy-manager桥
,否则您的
lazy:true
将被默默忽略(因此我起初认为这不是解决方案)。

我认为问题来自postgres本身。如果运行以下命令会发生什么:从public撤销数据库目标_DB上的连接;然后:从pg_stat_activity中选择pg_terminate_backend(pg_stat_activity.pid),其中pg_stat_activity.datname='TARGET_DB'@JessGabriel我不这么认为,在完全新鲜的环境(测试管道)中运行时也会发生这种情况,在docker中新创建了de containers+数据库。。。正如我所说,当我删除任何一种命令时,它也不会发生。因此,我很确定这是因为Symfony的配置组件正在启动导致两个db连接的所有服务。不幸的是,我已经尝试将原则
getWrappedConnection()
用于事件存储(正如我在失败的解决方案中所述!),但这不起作用。至于关闭测试中的连接,我甚至无法运行测试,当简单地调用CLI命令删除数据库时,它已经失败了(我这样做是为了在开始测试之前重置测试数据库)。这意味着当Symfony在内核引导上配置所有服务时,连接已经建立了。这是一个Symfony问题,而不是prooph问题。