Sistema com vários bancos

galera, estou trabalhando em um sistema que tem um banco central, e atravéz desse banco central o usuario devera se conectar em seu banco especifico, é um sistema de empresas onde cada empresa tem seu proprio banco.

O sistema é web e usa hibernate + spring com 3 backends diferentes, eu imaginei em armazenar a sessionfactory de cada empresa em um tipo de pool, e o usuario da empresa acessar esse pool e pegar a sessionfactory correspondente, soh que ai vem o problema, minha experiencia com spring não é suficiente para um monstro desses :X
(é um projeto pessoal) e gostaria de idéias dos jedi daqui :}

[]'s

Os dados são os mesmos em todos os bancos, ou seja, é um cluster de bancos? Ou cada base vai ter dados diferentes? Também não ficou muito claro esse banco central, pode explicar melhor?

Bom, caso seja um cluster de bancos, você passa o ip de todos os bancos no hibernate.cfg.xml.

Caso deva ser separado, a idéia de ter vários session factories me parece boa.

São vários bancos com dados diferentes, a principio pensei em usar um banco compartilhado para todas as empresas, mais isso com certeza vai me dar dor de cabeça posteriormente, então pensei nessa forma, um banco para cada empresa e o “banco central” é onde ficaram os dados de cada empresa, como o plano assinado, os dados da empresa, os dados de usuários administradores, pagamentos… enfim tudo que diz respeito a gerencia do plano de acesso ao sistema.

Axo que agora a idéia ficou mais clara pra que a galera possa opinar :}

Porque “dor de cabeça”? Eu teria apenas um para todos. E, caso necessário, teria um cluster de bancos.
Eu acho mais fácil ter uma tabela ‘Empresas’ e relacionamentos, do que ter que gerenciar session factories no código. É claro que você pode fazer isso de uma forma transparente usando algum padrão, mas a primeira vista não me parece a melhor opção.

axo mais seguro uma base pra cada empresa, caso ela desista do sistema, pode exportar em csv e boa…

sei la, do meu ponto de vista resolvi optar por essa abordagem… (só nao pergunte sobre os fundamentos pq aew complica uhuihsiuHIuh)…

problema resolvido com spring + hibernate configurado via código em um bean + um esquema para manter a sessionfactory :}

Tem como tu passar teu codigo, e explicar como funciona ???

estou passando pelo mesmo problema.

Se você tem vários bancos por que você não cria uma PU (persistence unit) pra cada um e não injeta um EM (EntityManager) pra específica quando você precisar?
Seja mais claro no que precisa!

Os bancos são independentes? Ou cada sistema vai precisar de informações de um banco ou outroS vez ou outra?
São sistemas independentes e diferentes?
Ou são cópias do mesmo sistema em paralelo pra clientes diferentes?
Ou o sistema é compartilhado diferenciando-se em tempo de execução pra cada cliente?

Bem…

é justamente oq vc disse …

eu tenho 1 banco e 5 schemas …

só que para cada schema, eu tenho uma persistence unit…

mas não sei porque… algo da errado…

qndo eu começo a fazer várias buscas…

ele da o erro seguinte: “erro fatal: muitos clientes conectados…”

eu passei por isso, quando abre e fecha conexao muitas vezes da esta mensagem.
olha seu codigo !

eu fiz isso no meu context.xml
<?xml version=“1.0” encoding=“ISO-8859-1”?>
<Context path="/meusite" docBase=“meusite” debug=“5” reloadable=“true” crossContext=“true”>
<Resource
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
maxActive="40000"
maxIdle="200"
maxWait="10000"
name="jdbc/minhaconexao"
type="javax.sql.DataSource"
url="jdbc:mysql://servidor/meubanco?autoReconnect=true"
username="usuario"
password=“senha” />
</Context>

ve se ajuda !

isso… coloca onde ? no web.xml ?

este arquivo: context.xml
eu to usando na pasta …\meusite\META-INF

  • Windows XP
  • Tomcat 6

Deu certo aqui mano.

eu fiz assim, coloquei dentro do meu persistence.xml , utilizei o pool de conexao c3p0.

&lt;persistence-unit name="BDSIFN" transaction-type="RESOURCE_LOCAL"&gt;
		&lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;
		&lt;class&gt;br.gov.ce.srh.patrimonio.entidade.Fornecedor&lt;/class&gt;
		&lt;class&gt;br.gov.ce.srh.patrimonio.entidade.Convenio&lt;/class&gt;
	
		
		&lt;properties&gt;
			&lt;property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /&gt;
			&lt;property name="hibernate.connection.username" value="financeiro" /&gt;
			&lt;property name="hibernate.connection.password" value="financeiropost" /&gt;
			&lt;property name="hibernate.connection.url" value="jdbc:postgresql://172.31.128.31:5432/BDSSRH" /&gt;
			&lt;property name="hibernate.default_schema" value="financeiro"/&gt;
			&lt;property name="hibernate.show_sql" value="true" /&gt;
			&lt;property name="hibernate.format_sql" value="true" /&gt;
			&lt;property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /&gt;
			
			
			&lt;property name="c3p0.acquire_increment" value="1" /&gt;
			&lt;property name="c3p0.idle_test_period" value="100" /&gt;
			&lt;property name="c3p0.max_size" value="10"/&gt;
			&lt;property name="c3p0.max_statements" value="0"/&gt;
			&lt;property name="c3p0.min_size " value="5" /&gt;
			&lt;property name="c3p0.timeout" value="100" /&gt; 
			&lt;property name="current_session_context_class" value="thread" /&gt;
			
		&lt;/properties&gt;
	&lt;/persistence-unit&gt;

[quote=nathanpsouza]São vários bancos com dados diferentes, a principio pensei em usar um banco compartilhado para todas as empresas, mais isso com certeza vai me dar dor de cabeça posteriormente, então pensei nessa forma, um banco para cada empresa e o “banco central” é onde ficaram os dados de cada empresa, como o plano assinado, os dados da empresa, os dados de usuários administradores, pagamentos… enfim tudo que diz respeito a gerencia do plano de acesso ao sistema.

Axo que agora a idéia ficou mais clara pra que a galera possa opinar :}[/quote]

Se vc está tentando implementar um sistema multi empresa isso é completamente errado. Desenhe o sistema para comportar todas as empreas num unico banco.

Estranho isso, porque não usa um banco só, e no cliente uma réplica dele como se fosse um cache para que o sistema possa funcionar off-line?
Não entendi a finalidade de um banco para cada empresa no MESMO ambiente.