Doctrine orm 原则2主/从连接

Doctrine orm 原则2主/从连接,doctrine-orm,Doctrine Orm,我正在研究设置Doctrine 2以使用USNGMySQL的主/从连接的不同方法。设置将使一个主数据库具有多个从属数据库。所有SELECT语句都应该来自一个随机的活动从属服务器,任何UPDATE、INSERT和DELETE语句都将始终委托给主连接 是否有人以这种方式建立了Doctine 2,或者对如何实现它有任何想法?据我所知,Doctine 2中没有对此的内置支持 看起来至少在mysql中,这个问题最终会在其他地方得到解决。无论是在php中,还是通过最近使用mysql本机驱动程序扩展进行的工作

我正在研究设置Doctrine 2以使用USNGMySQL的主/从连接的不同方法。设置将使一个主数据库具有多个从属数据库。所有SELECT语句都应该来自一个随机的活动从属服务器,任何UPDATE、INSERT和DELETE语句都将始终委托给主连接


是否有人以这种方式建立了Doctine 2,或者对如何实现它有任何想法?

据我所知,Doctine 2中没有对此的内置支持

看起来至少在mysql中,这个问题最终会在其他地方得到解决。无论是在php中,还是通过最近使用mysql本机驱动程序扩展进行的工作

尽管mysql_proxy可能已经准备好了,但由于它们都还没有准备好进入黄金时间,不幸的是,您唯一的直接选择是开始查看原则DBAL,并扩展内置类以灵活地处理事情——这意味着检测当前请求是否已完成任何写入操作可能是一个好主意,然后强制任何后续读取使用主机,避免任何与复制延迟相关的问题


希望在未来6-12个月内,我们将看到条令团队提供更正式的解决方案。但是,如果您现在需要它,那么它就是DIY了。

Doctrine2现在在\Doctrine\DBAL\Connections名称空间中有一个MasterSlaveConnection

编辑: 除非这篇文章不起作用,否则不要读下面的内容

不再需要重载,dbal配置将自己处理从机。e、 g

connections:
            default:
                driver:   %database_driver%
                host:     %database_host%
                dbname:   %database_name%
                user:     %database_user%
                password: %database_password%
                slaves:
                    slave1:
                        host:     %database_slave1%
                        dbname:   %database_name%
                        user:     %database_user%
                        password: %database_password%
如果上述方法无效,请尝试此方法

简单一点,就是在每台主机之间放置管道

default:
                driver:   %database_driver%
                host:     %database_host%|%database_slave%|%database_slave2%
                port:     3306
                dbname:   %database_name%
                user:     %database_user%
                password: %database_password%
                wrapper_class: \Foo\Bar\Symfony\Doctrine\Connections\MasterSlave


<?php
namespace Foo\Bar\Symfony\Doctrine\Connections;
use \Doctrine\DBAL\Connections\MasterSlaveConnection;
use Doctrine\DBAL\Connection,
        Doctrine\DBAL\Driver,
        Doctrine\DBAL\Configuration,
        Doctrine\Common\EventManager,
        Doctrine\DBAL\Event\ConnectionEventArgs,
        Doctrine\DBAL\Events,
        Doctrine\DBAL\Cache\QueryCacheProfile;

class MasterSlave extends MasterSlaveConnection
{
        public function __construct(array $params, Driver $driver, Configuration $config = null, EventManager $eventManager = null)
        {
                $tempParams = array(
                                'master' => array()
                                , 'slaves' => array()
                                , 'driver' => $params['driver']
                                );
                $hosts = explode('|', $params['host']);
                unset($params['host']);
                foreach($hosts as $num => $host)
                {
                        $params['host'] = $host;
                        if($num == 0)
                        {
                                $tempParams['master'] = $params;
                        }
                        else
                        {
                                $tempParams['slaves'][] = $params;
                        }
                }

                if(!isset($tempParams['master']['driver']))
                        $tempParams['master']['driver'] = "pdo_mysql";

                foreach($tempParams['slaves'] as $k => $slave)
                {
                        if(!isset($slave['driver']))
                                $tempParams['slaves'][$k]['driver'] = "pdo_mysql";
                }
                parent::__construct($tempParams, $driver, $config, $eventManager);
        }

        public function executeQuery($query, array $params = array(), $types = array(), QueryCacheProfile $qcp = null)
        {
                try
                {
                        return parent::executeQuery($query, $params, $types, $qcp);
                }
                catch(\Exception $e)
                {
                        $logger = new \Uelib\Core\Logger();
                        $message = $e->getMessage() . "\nSql: " . $query . "\nParams: \n" . print_r($params, true);
                        $logger->log($message);
                        throw $e;
                }
        }
}

最后,我选择实现我们自己的连接包装器,它似乎完成了这一任务。我希望D2在以后的版本中正式开发该功能。唯一的问题是,我不知道如何让symfony在需要的配置中发挥出色