Symfony 2.7缓存:清除命令检查每个数据库连接 [英] Symfony 2.7 cache:clear command checks every database connection

查看:463
本文介绍了Symfony 2.7缓存:清除命令检查每个数据库连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我的config.yml中的某些连接是可选项,并且描述了不需要的外部数据库。

我刚刚升级到symfony 2.7,并且有一个令人讨厌的行为。用于每个prod实例。



当执行缓存时:清除,似乎现在每个连接都被检查,即使我不希望它们在特定服务器上处于活动状态。 >

设置--no-warmup选项时,问题出现一半时间

  php app / console cache:clear --env = prod --no-warmup --verbose 




[Doctrine\DBAL\Exception\ConnectionException]

驱动程序出现异常:SQLSTATE [42000] [1049]未知
数据库'bal_syncrho_database'



异常跟踪:()at
/var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:103
Doctrine\DBAL\Driver\AbstractMySQLDriver-> convertException()at
/var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:133
Doctrine\DBAL\DBALException :: driverException()at
/ var / www / ror3 / vendor / doctrine / dbal / lib / Doctrine /DBAL/Driver/PDOMySql/Driver.php:47
Doctrine\DBAL\Driver\PDOMySql\Driver-> connect()at
/ var / www / ror3 / vendor / doctrine / dbal / lib / Doctrine / DBAL / Connection.php:360
Doctrine\DBAL\Connection-> connect()at
/ var / www / ror3 / vendor / doctrine / dbal / lib / Doctrine /DBAL/Connection.php:429
Doctrine\DBAL\Connection-> getDatabasePlatformVersion()at
/ var / www / ror3 / vendor / doctrine / dbal / lib / Doctrine / DBAL / Connection。 php:389
Doctrine\DBAL\Connection-> detectDatabasePlatform()at
/var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:328
Doctrine\DBAL\Connection-> getDatabasePlatform()at
/var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:763
学说\ORM\Mapping\ClassMetadataFactory-> getTargetPlatform()at
/var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:616
原则\O RM\Mapping\ClassMetadataFactory-> completeIdGeneratorMapping()
at
/var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:174
Doctrine\ORM\Mapping\ClassMetadataFactory-> doLoadMetadata()at
/var/www/ror3/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php:332
Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory-> loadMetadata()
at
/ var / www / ror3 / vendor / doctrine / orm / lib / Doctrine / ORM / Mapping /ClassMetadataFactory.php:78
Doctrine\ORM\Mapping\ClassMetadataFactory-> loadMetadata()at
/ var / www / ror3 / vendor / doctrine / common / lib / Doctrine / Common / Persistence /Mapping/AbstractClassMetadataFactory.php:216
Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory-> getMetadataFor()
at
/ var / www / ror3 / vendor / doctrine /常见的/ lib目录/教义/通用/持久性/ Mappi ng / AbstractClassMetadataFactory.php:115
Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory-> getAllMetadata()
at
/ var / www / ror3 / vendor / symfony / symfony /src/Symfony/Bridge/Doctrine/CacheWarmer/ProxyCacheWarmer.php:69
Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer-> warmUp()at
/ var / www / ror3 / vendor / symfony / symfony / src / Symfony / Component / HttpKernel / CacheWarmer / CacheWarmerAggregate.php:48
Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate-> warmUp()
at / var /www/ror3/app/bootstrap.php.cache:2641
Symfony\Component\HttpKernel\Kernel-> initializeContainer()at
/var/www/ror3/app/bootstrap.php .cache:2411
Symfony\Component\HttpKernel\Kernel-> boot()at
/ var / www / ror3 / vendor / symfony / symfony / src / Symfony / Bundle / FrameworkBundle / Console /Application.php:70
Symfony\Bundle\FrameworkBundle\Consol e\Application-> doRun()在
/var/www/ror3/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:120
Symfony\Component\ Console\Application-> run()在

/ var / www / ror3 / app / console:27



解决方案

Doctrine试图确定Database Platform版本。



您可以避免在 Doctrine DBAL配置服务器版本。从文档:


在Doctrine DBAL 2.5中添加了server_version选项,它是由DoctrineBundle 1.3使用的
。此选项的值应与您的
数据库服务器版本(使用postgres -V或psql -V命令找到
您的PostgreSQL版本和mysql -V来获取您的MySQL版本)。



如果您没有定义此选项,并且尚未创建数据库,则可能会导致PDOException错误,因为Doctrine将
尝试猜测数据库服务器版本



例如:

 #config.yml 

doctrine:
dbal:
...
server_version:5.6

希望这个帮助


I just have upgraded to symfony 2.7, and have a annoying behaviour.

Some connections in my config.yml are optionables, and describe foreign databases that are not intended to be used in every prod instances.

When doing a cache:clear , it seems that now every connections are checked, even if I don't want them to be active on a particular server.

When setting the --no-warmup option, the problem occurs half the time

php app/console cache:clear --env=prod --no-warmup --verbose

[Doctrine\DBAL\Exception\ConnectionException]
An exception occured in driver: SQLSTATE[42000] [1049] Unknown database 'bal_syncrho_database'

Exception trace: () at /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:103 Doctrine\DBAL\Driver\AbstractMySQLDriver->convertException() at /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:133 Doctrine\DBAL\DBALException::driverException() at /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOMySql/Driver.php:47 Doctrine\DBAL\Driver\PDOMySql\Driver->connect() at /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:360 Doctrine\DBAL\Connection->connect() at /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:429 Doctrine\DBAL\Connection->getDatabasePlatformVersion() at /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:389 Doctrine\DBAL\Connection->detectDatabasePlatform() at /var/www/ror3/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:328 Doctrine\DBAL\Connection->getDatabasePlatform() at /var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:763 Doctrine\ORM\Mapping\ClassMetadataFactory->getTargetPlatform() at /var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:616 Doctrine\ORM\Mapping\ClassMetadataFactory->completeIdGeneratorMapping() at /var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:174 Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata() at /var/www/ror3/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php:332 Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata() at /var/www/ror3/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:78 Doctrine\ORM\Mapping\ClassMetadataFactory->loadMetadata() at /var/www/ror3/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php:216 Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor() at /var/www/ror3/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php:115 Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getAllMetadata() at /var/www/ror3/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/CacheWarmer/ProxyCacheWarmer.php:69 Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer->warmUp() at /var/www/ror3/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php:48 Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp() at /var/www/ror3/app/bootstrap.php.cache:2641 Symfony\Component\HttpKernel\Kernel->initializeContainer() at /var/www/ror3/app/bootstrap.php.cache:2411 Symfony\Component\HttpKernel\Kernel->boot() at /var/www/ror3/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:70 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /var/www/ror3/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:120 Symfony\Component\Console\Application->run() at
/var/www/ror3/app/console:27

解决方案

Doctrine is trying to determine the Database Platform Version.

You can avoid this behaviour adding in the Doctrine DBAL Configuration the server version. From the doc:

The server_version option was added in Doctrine DBAL 2.5, which is used by DoctrineBundle 1.3. The value of this option should match your database server version (use postgres -V or psql -V command to find your PostgreSQL version and mysql -V to get your MySQL version).

If you don't define this option and you haven't created your database yet, you may get PDOException errors because Doctrine will try to guess the database server version automatically and none is available.

As example:

#config.yml

doctrine:
    dbal:
    ...
        server_version:       5.6

Hope this help

这篇关于Symfony 2.7缓存:清除命令检查每个数据库连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆