2

状況

Symfony 4.3 内のコマンドバス、イベントバス、およびイベントストアに Prooph を使用しています。すべての集約をイベントソースにする必要があるわけではないため、Doctrine DBAL を使用して単純な集約を単純に 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.
  • イベントソースのリポジトリを持つすべてのコマンドを無効にしてみましたが、問題は修正されました。
  • DBAL リポジトリを持つすべてのコマンドを無効にしてみましたが、問題は修正されました。
  • このコマンドバスを注入しないようにしましたが、問題は修正されました。

したがって、PDO 接続を使用するサービスを DBAL 接続を使用するサービスと組み合わせて使用​​すると、問題が発生すると結論付けることができます。

ソリューション (失敗)

$connection->getWrappedConnection()私が考えた解決策は、Prooph Eventstoreに Doctrine DBAL を使用することでした。明らかに、タイプヒンティングはこれを許可しません ( -interface をgetWrappedConnection()返しますConnection) が、実際の Doctrine PDOConnectionextends\PDOが機能する場合は、この時点でハッキネスを受け入れます! ただし、無駄に、まだ2つの接続があります。

4

2 に答える 2

0

つまり、遅延読み込みを使用して、カーネルの起動中に実際の DB 接続が行われないようにしました。必ず黙って無視してcomposer require symfony/proxy-manager-bridgeくださいlazy: true(したがって、最初は解決策ではないと思いました)。

于 2019-10-04T07:06:49.603 に答える