@HellWalk

Как в Doctrine, в DBAL указать PDO::ATTR_PERSISTENT => true?

В тестах получаю ошибку:

[Doctrine\DBAL\Exception\ConnectionException] An exception occurred in driver: SQLSTATE[08006] [7] ВАЖНО: извините, уже слишком много клиентов


Соответственно нужно указать доктрине, чтобы она использовала одно подключение на все запросы. Напрямую через php это делается так:

$connection = new PDO('DSN', 'user', 'password', [PDO::ATTR_PERSISTENT => true]);

Но как указать аналогичный параметр в доктрине?
  • Вопрос задан
  • 321 просмотр
Решения вопроса 1
@HellWalk Автор вопроса
Проблема с лимитом подключений к базе в тестах решилась добавлением $this->entityManager->getConnection()->close(); в tearDown()

/**
* @throws ConnectionException
*/
public function tearDown(): void
{
    parent::tearDown();
    // ...
    $this->entityManager->getConnection()->close();
}


Забавно, что в официальной документации (с.м. последний пример):
https://symfony.com/doc/current/testing/database.html

Указано:
protected function tearDown(): void
{
    parent::tearDown();

    // doing this is recommended to avoid memory leaks
    $this->entityManager->close();
    $this->entityManager = null;
}


Что, по факту, не помогало решить проблему с лимитом подключений.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Maksclub
@Maksclub
maksfedorov.ru
Ентити-менеджер использует один объект Connection, Connection использует объект PDO, всегда везде одно подключение и работает во всем жизненном цикле приложения, в этом и суть работы (ну в том числе) DI контейнера — отдавать один и тот же объект и не плодить их. То есть на жизненный цикл приложения все и так работает

Тесты функциональные? Может плодится много http запросов в разных процессах? Но если и так — то все равно процессы разные и объекты PDO разные, так что ваша настройка не сработает, тк просто сами приложения будут разные...

Для таких случаев в Codeception есть такая штука как persistService, по идее сервис (в вашем случае EntityManager, если через него работаете, или Connection, если через DBAL работаете) должен один идти через эту штуку единый, даже если разные http запросы
https://codeception.com/docs/modules/Symfony#persi...

Крч, раскройте немного деталей ваших тестов и ситуации, может я все не туда пишу
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы