测试期间达到的最大连接MySql

时间:2014-12-15 15:10:17

标签: php mysql zend-framework2 phpunit database-connection

当我启动我的PHPUnit测试套件时,我达到了MySQL的最大连接限制(200)。

热门修复是将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();

我检查了是否有拆机,是的。

我不明白的是:在每次测试中,都会创建一个新的连接实例,为什么这不是同一个实例? (像单身人士或登记处)? 但是这个实例永远不会关闭,即使它在测试通过后也没有使用过。

我误会了什么,但不知道是什么。

4 个答案:

答案 0 :(得分:4)

在这样做之前我已经解决了类似的问题:

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
}

}

答案 1 :(得分:3)

我们始终使用以下设置进行配置:

set-variable = max_connections = 1500

set-variable = max_user_connections = 300

哪里有< 10个将连接到服务器的用户。这样就可以为超级用户打开连接。我们的mysql服务器通常有2-3个应用程序用户。因此,使用3,我们的用户只能使用900个连接。如果您想进一步调整它,还可以限制每个用户的连接。

答案 2 :(得分:3)

您的测试是否需要针对MySql运行?

使用Doctrine,您可以使用sqlite db进行测试。除非特别需要使用MySql,否则这种方法可以改善您的测试过程并使您免受实际单元测试之外的问题的影响。

此外,您可能会通过对内存数据库进行测试来看到速度提升。

答案 3 :(得分:3)

我建议您阅读有关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;
     }
  }
?>