2011-02-07 19 views
7

Farklı ayar yollarına bakıyorum Doctrine 2, MySQL kullanarak master/slave bağlantılarını kullanmak için. Kurulum, çoklu slave'lere sahip bir ana veritabanı olacak şekilde olurdu. Tüm SELECT ifadeleri rastgele bir canlı bağımlıdan gelmeli ve herhangi bir UPDATE, INSERT, DELETE ifadesi her zaman ana bağlantıya verilecektir.Doctrine 2 Master/Slave bağlantıları

Bu şekilde Doctine 2'yi kuran veya buna nasıl yaklaşılacağı hakkında herhangi bir fikriniz olan var mı? (En azından mysql ile), bu sorun eninde sonunda başka bir yerde çözülecek gidiyor sanki

cevap

0

Bildiğim kadarıyla orada yerleşik olmayan destek bunun için Doktrini 2.

içinde bildiğimiz Gerçekten görünüyor. Ya mysql_proxy yılında ya mysqlnd (php mysql yerli sürücü uzantısı) Bu iki seçenek de (mysql_proxy olabilir gerçi), yayınlanmaya hazır olduğundan

ile bazı çok son çalışmasında aracılığıyla, tek acil seçenek maalesef başlatmak için olduğunu Doctrine DBAL'e bakarak ve işleri akıllı bir şekilde ele almak için yerleşik sınıfları genişletmek anlamına gelir. Bu, geçerli isteğin herhangi bir yazımının yazımını yapıp yapmadığını saptamak için iyi bir fikir olabilir ve daha sonra, master'ı kullanmak için sonraki tüm okumaları zorlayabilir herhangi bir çoğaltma gecikme ile ilgili sorunları önler.

Umarım önümüzdeki 6-12 ay içinde Doktrini ekibinden daha resmi bir çözüm göreceğiz. Ama şimdi buna ihtiyacınız varsa, DIY, AFAIK.

+0

arasında |() Yukarıdaki çalışmıyor, basit bu

şey denerseniz

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% 

, sadece boru koyun hile yapmış olmak. Umarım D2, daha sonraki bir sürümde resmi olarak gelişir. – Kevin

7

Doctrine2, \ Doctrine \ DBAL \ Connections ad alanında bir MasterSlaveConnection'a sahiptir.

DÜZENLEME: Dont bu parça doesnt iş

Dont sürece, DBal yapılandırmaları kendisi tarafından köle alacak artık bir overloader ihtiyaç aşağıda okuyun. Örneğin. Ben göründüğü kendi Bağlantı sarmalayıcıyı uygulamak için tercih Sonunda her ana

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; 
       } 
     } 
} 
+0

sadece sorun, Ihtiyaçları yapılandırma – Ascherer

+0

gereksinimi ile güzel oynamak için symfony nasıl elde edeceğini anlayamıyorum Bu artık ihtiyacım yok !!!!, okuma okumak – Ascherer

+2

Bu @Kevin kabul etmek için zaman olabilir? – alex88

İlgili konular