Prooph Eventstore (PDO) и Doctrine DBAL приводят к нескольким соединениям
Ситуация
Я использую Prooph для моей командной шины, шины событий и хранилища событий в 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 ответа
Короче говоря, я использовал отложенную загрузку, чтобы убедиться, что во время загрузки ядра не было никаких фактических подключений к БД. Только не забудьтеcomposer require symfony/proxy-manager-bridge
или ваш lazy: true
будет просто игнорироваться молча (поэтому сначала я подумал, что это не решение).
Второй аргумент конструктора MySQLEventStore - это соединение PDO, см. https://github.com/prooph/pdo-event-store/blob/master/src/MySqlEventStore.php. Вы можете использовать один и тот же экземпляр PDO для Doctrine и EventStore, но это довольно опасно, поскольку вы можете помешать его обработке транзакций. Я бы порекомендовал закрыть соединение с Doctrine в тестах перед удалением базы данных.