Prooph Eventstore (PDO) и Doctrine DBAL приводят к нескольким соединениям - PullRequest
2 голосов
/ 01 октября 2019

Ситуация

Я использую Prooph для моей командной шины, eventbus и хранилища событий в Symfony 4.3. Так как не каждый агрегат должен быть обработан событиями, мы также используем 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 подключения.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Короче говоря, я использовал ленивую загрузку, чтобы убедиться, что во время загрузки ядра не было никаких реальных подключений к БД. Просто убедитесь, что composer require symfony/proxy-manager-bridge или ваш lazy: true будет просто игнорироваться (поэтому я сначала подумал, что это не решение).

0 голосов
/ 02 октября 2019

Вторым аргументом в конструкторе MySQLEventStore является соединение PDO, см. https://github.com/prooph/pdo-event-store/blob/master/src/MySqlEventStore.php#L82. Вы можете использовать один и тот же экземпляр PDO для Doctrine и EventStore, но это опасно, так как вы можете помешать обработке его транзакций. Я бы порекомендовал закрыть соединение Doctrine в тестах, прежде чем отбрасывать базу данных.

...