adgoal / dbal-fault-tolerance
在 doctrine/dbal 上自动重连 Doctrine MySql "has gone away" 异常
v1.9.2
2019-09-30 11:46 UTC
Requires
- php: ^7.1
- ext-pdo: *
- doctrine/dbal: ^2.3
- psr/log: ^1.0
Requires (Dev)
- jakub-onderka/php-parallel-lint: ^1.0
- jangregor/phpstan-prophecy: ^0.4.2
- mockery/mockery: ^1.2
- phpmd/phpmd: ^2.6
- phpstan/phpstan: ^0.9 || ^0.11
- phpstan/phpstan-mockery: ^0.11.0
- phpstan/phpstan-phpunit: ^0.11
- phpunit/phpunit: ^5.4.3 || 7.5.*
- symplify/easy-coding-standard: ^5.4
README
DBALFaultTolerance
在 doctrine/dbal >=2.3, <3.0 上自动重连 Doctrine MySql "has gone away" 异常
安装
$ composer require adgoal/dbal-fault-tolerance
配置
为了使用 DBALFaultTolerance,您必须设置 wrapperClass
和 driverClass
连接参数。您可以设置 Doctrine 能够重连的次数,通过设置 x_reconnect_attempts
驱动程序选项。其值应为整数。
您可以使用参数 force_ignore_transaction_level
强制忽略事务级别。
连接实例化时配置示例
use Doctrine\DBAL\Configuration; use Doctrine\DBAL\DriverManager; $config = new Configuration(); //.. $connectionParams = array( 'dbname' => 'mydb', 'user' => 'user', 'password' => 'secret', 'host' => 'localhost', // [dbal-fault-tolerance] settings 'wrapperClass' => Adgoal\DBALFaultTolerance\Connection::class, 'driverClass' => Adgoal\DBALFaultTolerance\Driver\PDOMySql\Driver::class, 'driverOptions' => [ 'x_reconnect_attempts' => 3, 'force_ignore_transaction_level' => true ] ); $conn = DriverManager::getConnection($connectionParams, $config); //..
Symfony 2 项目上的 YAML 配置示例
# Doctrine example Configuration doctrine: dbal: default_connection: %connection_name% connections: %connection_name%: host: %database_host% port: %database_port% dbname: %database_name% user: %database_user% password: %database_password% charset: UTF8 wrapper_class: 'Adgoal\DBALFaultTolerance\Connection' driver_class: 'Adgoal\DBALFaultTolerance\Driver\PDOMySql\Driver' options: x_reconnect_attempts: 3
Zend Framework 2/3 项目上的配置示例
return [ 'doctrine' => [ 'connection' => [ 'orm_default' => [ 'driverClass' => \Adgoal\DBALFaultTolerance\Driver\PDOMySql\Driver::class, 'wrapperClass' => \Adgoal\DBALFaultTolerance\Connection::class, 'params' => [ 'host' => 'localhost', 'port' => '3307', 'user' => '##user##', 'password' => '##password##', 'dbname' => '##database##', 'charset' => 'UTF8', 'driverOptions' => [ 'x_reconnect_attempts' => 9, 'force_ignore_transaction_level' => true ] ], ], ], ], ];
如果您使用主/从 Doctrine 配置,可以使用包装类 Adgoal\DBALFaultTolerance\Connections\MasterSlaveConnection
。
用法
在执行任何其他操作(除 SELECT 外)之前,尝试强制重连长时间运行的任务,可以调用
$em->getConnection()->refresh();
相反,如果您的下一个查询将是 SELECT,重连将自动完成。
从 v1.6
开始,在 $em->getConnection()->beginTransaction()
调用期间也启用自动重连,这也在简单的 $em->flush()
期间工作,如果之前没有事务。
感谢
感谢 Dieter Peeters 及其关于 DBAL-275 的建议。如果您使用 doctrine/dbal <2.3,请查看。