Zend_Db: Multiplos Bancos (Escrita X Leitura)

133 views
Skip to first unread message

Diego

unread,
Aug 31, 2010, 9:06:07 PM8/31/10
to zfbr...@googlegroups.com
Fala pessoal. Blz?

É possível (ou já existe algo pronto) configurar o Zend_Db para trabalhar com um banco de escrita e um banco de leitura?

--
Diego Noguês
di...@projecttus.com
www.projecttus.com
(41) 3095 5067


Mychel Candido

unread,
Sep 1, 2010, 9:47:59 AM9/1/10
to zfbr...@googlegroups.com


Cara não sei se é isto que voce procura mas eu uso o resouces.multidb

e troco o adapter selecionando o banco que eu quero

  1. resources.multidb.db1.adapter = "pdo_mysql"
  2. resources.multidb.db1.host = "localhost"
  3. resources.multidb.db1.username = "webuser"
  4. resources.multidb.db1.password = "XXXX"
  5. resources.multidb.db1.dbname = "db1"
  6.  
  7. resources.multidb.db2.adapter = "pdo_pgsql"
  8. resources.multidb.db2.host = "example.com"
  9. resources.multidb.db2.username = "dba"
  10. resources.multidb.db2.password = "notthatpublic"
  11. resources.multidb.db2.dbname = "db2"
  12. resources.multidb.db2.default = true

                
                $db = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('multidb')->getDb('db2');
               
                Zend_Db_Table_Abstract::setDefaultAdapter($db);


--------------------------



--
Essa mensagem faz parte do grupo "zfbrasil" no Google Groups.
Para escrever neste grupo, envie um email para zfbr...@googlegroups.com
Para se desligar do grupo, envie um email para zfbrasil-u...@googlegroups.com
Mais informações, visite o grupo em http://groups.google.com/group/zfbrasil?hl=pt-BR

Diego

unread,
Sep 1, 2010, 10:05:49 AM9/1/10
to zfbr...@googlegroups.com
Mychel,

Creio que usaria o multidb, mas o que me refiro é deixar a 'troca' de bancos transparente.
Quando for select usa o banco 1, quando insert/update/delete usa o banco 2 automaticamente.

Wesley Willians

unread,
Sep 1, 2010, 10:26:42 AM9/1/10
to zfbr...@googlegroups.com
Diego,

Da para vc fazer isso no mapper, se estiver usando.
Nesses pontos o mapper ajuda mt.

--
@wesleywillians
www.schoolofnet.com


2010/9/1 Diego <diego...@gmail.com>

Mychel Candido

unread,
Sep 1, 2010, 12:10:28 PM9/1/10
to zfbr...@googlegroups.com


bom não sei se funciona nunca tentei mas voce poderia
quando instanciar uma table voce pode adicionar a seguinte linha no construtor


db = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('multidb')->getDb('db2');               
Zend_Db_Table_Abstract::setDefaultAdapter($db);

colocando assim nos locais onde quer select os db1, e onde quer os outros, o db2


------------

Diego

unread,
Sep 1, 2010, 1:22:13 PM9/1/10
to zfbr...@googlegroups.com
Mychel,

Nesse caso não teria o 'pulo-do-gato' de fazer automático. Eu teria que mudar todas as minhas queries que já estão prontas pra pegar o DB correspondente.

Wesley,

Pensei nessa alternativa, assim que sobrar um tempinho vou testar. Pensei que tinha algo implementado no próprio ZF pra fazer isso, por isso recorri à lista.

Euller Cristian

unread,
Sep 1, 2010, 1:26:52 PM9/1/10
to zfbr...@googlegroups.com


Eu utilizo o multidb e o padrão mapper.

 

No mapper antes de realizar a query eu seto o banco de dados, que esta em um registry.

 

Exemplo

 

Public function cadastrar()

{

   $this->setDb(Zend_Registry::get(‘dbleitura’);

Alan Tavares

unread,
Sep 1, 2010, 2:07:52 PM9/1/10
to zfbr...@googlegroups.com
Não seria mais simples estender a classe Zend_Db_Table e alterar as funções 'select', 'insert', 'update', 'delete' alterando o adpater na função 'select' e retornando ao adpater master nas 'update', 'insert', 'delete' ?

A única dificuldade seria alterar os Models para estender da nova classe Db_Table.

Diego

unread,
Sep 3, 2010, 11:14:23 AM9/3/10
to zfbr...@googlegroups.com
Aproveitando o gancho do Mychel.

Testei o resources.multidb como sugerido e deu o erro abaixo.
Fiz uma pesquisa rápida no google e não achei uma solução. Estranho isso porque a sintaxe é a mesma da documentação.

Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'Unable to resolve plugin "multidb"; no corresponding plugin with that name' in /var/zend/ZendFramework-1.8.4/library/Zend/Application/Bootstrap/BootstrapAbstract.php:327 Stack trace: #0 /var/zend/ZendFramework-1.8.4/library/Zend/Application/Bootstrap/BootstrapAbstract.php(377): Zend_Application_Bootstrap_BootstrapAbstract->getPluginResource('multidb') #1 /var/zend/ZendFramework-1.8.4/library/Zend/Application/Bootstrap/BootstrapAbstract.php(389): Zend_Application_Bootstrap_BootstrapAbstract->getPluginResources() #2 /var/zend/ZendFramework-1.8.4/library/Zend/Application/Bootstrap/BootstrapAbstract.php(592): Zend_Application_Bootstrap_BootstrapAbstract->getPluginResourceNames() #3 /var/zend/ZendFramework-1.8.4/library/Zend/Application/Bootstrap/BootstrapAbstract.php(553): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap(NULL) #4 /var/zend/ZendFramework-1.8.4/library/Zend/Application.php(317): Zend_Application_Bootstrap_BootstrapAbstr in /var/zend/ZendFramework-1.8.4/library/Zend/Application/Bootstrap/BootstrapAbstract.php on line 327

Alan Tavares

unread,
Sep 3, 2010, 12:40:38 PM9/3/10
to zfbr...@googlegroups.com
Resource multidb disponível a partir do Zend Framework 1.10.

Como você pode ver no link dos resources da 1.8: http://zendframework.com/manual/1.8/en/zend.application.available-resources.html

Diego

unread,
Sep 3, 2010, 1:52:13 PM9/3/10
to zfbr...@googlegroups.com
Hmm. Pensei nessa possibilidade mas não corri atrás.

Mas então, não tem como usar dois bds em uma versão antes da 1.10?

Renan de Lima

unread,
Sep 3, 2010, 2:03:13 PM9/3/10
to zfbr...@googlegroups.com
como o pessoal comentou, o multidb funciona bem, sentado no meu sofá
tomando meu suco de maracujá e longe do problema, acho ele a melhor
solução ainda é o mutidb

sugiro fazer uma cópia do resource e colocar no seu namespace e
registrá-lo, algo como My_Application_Resource_Multidb, renomeie a
classe original e seja feliz,
depois de criar o arquivo, adicione isso no application|config|whatever.ini
autoloaderNamespaces[] = "My"
pluginPaths.My_Application_Resource = "My/Application/Resource"

utilize o multidb igualzinho no 1.10

--
Renan de Lima Barbosa

2010/9/3 Diego <diego...@gmail.com>:

Diego

unread,
Sep 3, 2010, 3:10:20 PM9/3/10
to zfbr...@googlegroups.com
Postgres + Schemas separados = solução do problema =]

Agradeço as dicas pessoal!
Reply all
Reply to author
Forward
0 new messages