Максимальное соединение MySql, достигнутое во время тестов

Когда я запускаю свой тестовый пакет PHPUnit, я достиг максимального предела подключения (200) для MySQL.

Горячее исправление заключалось в том, чтобы установить max_connection на 500, но я ищу лучшее решение в контексте Zend Framework 2.

Я попытался поместить некоторый метод tearDown, но не повезло, это кажется бесполезным или неполным решением.

Это пример кода:

protected function tearDown()
{
    // i have two entitymanager
    $this->getObjectManager()->get('doctrine.connection.orm_alternate')->close();
    $this->getObjectManager()->get('doctrine.connection.orm_default')->close();
    $this->application = null;
    gc_collect_cycles();
    parent::tearDown();
}

Я также пытался использовать processIsolation, чтобы обратиться к true, но некоторые тесты так долго, что я предположил, что моя консоль застыла или что-то в этом роде....

С подключением doctrine2 и Zend Framework, как я могу предотвратить это "слишком много соединений" во время тестов PHPunit?

до сих пор с подсказками @awons я пытался изменить $this->getObjectManager()->get('doctrine.connection.orm_alternate')->close();

в $this->getObjectManager()->get('doctrine.entitymanager.orm_alternate')->close();

Я проверил, был ли вызван срыв, да.

Что-то я не понимаю: в каждом тесте создается новый экземпляр моих подключений, почему это не тот же экземпляр? (например, singleton или Registry)? Но этот экземпляр никогда не закрывается, даже если он не используется после прохождения теста.

Я что-то делаю, но не знаю, что.

Ответ 1

Я решил аналогичную проблему, прежде чем делать это следующим образом:

protected static $my_db_for_testing

public static function setUpBeforeClass()
{
    //create your DB connection once, here.
    $self::$my_db_for_testing = new DbConnectionWhatever()
}

protected function setUp()
{
    $this->my_obj_to_test = new MyObject();
    $this->my_obj_to_test->setDb($this->my_db_for_testing);
}



public function testOne()
{
    //normal test here
}

public static function tearDownAfterClass()
{
    //close the DB connection here
}

}

Ответ 2

Мы всегда настраиваем с такими настройками, как:

set-variable = max_connections = 1500

set-variable = max_user_connections = 300

Где есть < 10 пользователей, которые будут подключаться к серверу. Это открывает связи для суперпользователей. Обычно у нас есть 2-3 приложения для наших серверов mysql. Таким образом, с 3, наши пользователи могут использовать только 900 соединений. Вы можете дополнительно ограничить подключение для каждого пользователя, если хотите еще больше настроить его.

Ответ 3

Нужно ли запускать ваши тесты на MySql?

С помощью Doctrine вы можете использовать sqlite db для тестирования. Если не существует конкретной потребности в использовании MySql, это метод, который может улучшить процесс тестирования и изолировать вас от проблем вне ваших фактических модульных тестов.

Кроме того, вы можете потенциально видеть прирост скорости, выполняя тесты против базы данных в памяти.

Ответ 4

Я рекомендую прочитать главу fixtures. Чтобы избежать создания нового соединения для каждого теста, используйте setUpBeforeClass(), чтобы установить соединение с БД один раз и повторно использовать это соединение для каждого из ваших тестов.

<?php
  class DatabaseTest extends PHPUnit_Framework_TestCase
  {
     protected static $dbh;

     public static function setUpBeforeClass()
     {
       self::$dbh = new PDO('sqlite::memory:');
     }

     public static function tearDownAfterClass()
     {
       self::$dbh = NULL;
     }
  }
?>