Configurar acesso a 2 banco de dados com Spring e Hibernate

5 respostas
J

Estou desenvolvendo uma aplicação que irá se conectar à vários banco de dados. Não sei exatamente com irei fazer isso. A princípio estou querendo testar a conexão em 2 bancos distintos. Utilizo Spring + Hibernate. Minha dúvida inicial é como configurar meus arquivos persistence.xml e applicationContext.xml com vários datasources.

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>

<persistence-unit name="cnjbrasil_rr">

    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <properties>
        <property name="hibernate.archive.autodetection"
			value="class, hbm" />

		<!--Configuracoes de dialeto e conexao-->
        <property name="hibernate.dialect"
			value="org.hibernate.dialect.MySQLInnoDBDialect" />
        <property name="hibernate.connection.driver_class"
			value="com.mysql.jdbc.Driver" />
        <property name="hibernate.connection.url"
			value="jdbc:mysql://localhost/cnjbrasil_rr" />
        <property name="hibernate.connection.username"
			value="root" />
        <property name="hibernate.connection.password"
			value="123456" />

		<!--Configuracoes de Debug-->
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="use_sql_comments" value="true" />
		
        <!--Configuração do segundo nível de cache-->
        <property name="hibernate.cache.provider_class"
                  value="net.sf.ehcache.hibernate.EhCacheProvider" />
        
        <property name="hibernate.cache.provider_configuration"
                  value="/ehcache.xml" />
        
        <property name="hibernate.cache.use_minimal_puts"
                  value="false" />
        <property name="hibernate.cache.use_query_cache"
                  value="true" />
        <property name="hibernate.cache.use_second_level_cache"
                  value="true" />
        <property name="hibernate.cache.use_structured_entries"
                  value="true" />
      <!--  
        <property name="hibernate.ejb.classcache.br.com.projudi.entities.Categoria"
                  value="read-write" />

        <property name="hibernate.ejb.classcache.br.com.projudi.entities.Parte"
                  value="read-write" />

        <property name="hibernate.ejb.classcache.br.com.projudi.entities.Certidao"
                  value="read-write" />

        <property name="hibernate.ejb.classcache.br.com.projudi.entities.TipoCertidao"
                  value="read-write" />
        

        Configuração do pool de c3p0-->           
        <property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.max_size" value="20" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.idle_test_period" value="3000"/>
        


    </properties>

</persistence-unit>

<persistence-unit name="cnjbrasil_rr2">

    <provider>org.hibernate.ejb.HibernatePersistence</provider>
 


    <properties>
        <property name="hibernate.archive.autodetection"
			value="class, hbm" />

		<!--Configuracoes de dialeto e conexao-->
        <property name="hibernate.dialect"
			value="org.hibernate.dialect.MySQLInnoDBDialect" />
        <property name="hibernate.connection.driver_class"
			value="com.mysql.jdbc.Driver" />
        <property name="hibernate.connection.url"
			value="jdbc:mysql://localhost/cnjbrasil_rr2" />
        <property name="hibernate.connection.username"
			value="root" />
        <property name="hibernate.connection.password"
			value="123456" />

		<!--Configuracoes de Debug-->
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="use_sql_comments" value="true" />

        <!--Configuração do segundo nível de cache-->
        <property name="hibernate.cache.provider_class"
                  value="net.sf.ehcache.hibernate.EhCacheProvider" />

        <property name="hibernate.cache.provider_configuration"
                  value="/ehcache.xml" />

        <property name="hibernate.cache.use_minimal_puts"
                  value="false" />
        <property name="hibernate.cache.use_query_cache"
                  value="true" />
        <property name="hibernate.cache.use_second_level_cache"
                  value="true" />
        <property name="hibernate.cache.use_structured_entries"
                  value="true" />
<property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.max_size" value="20" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.idle_test_period" value="3000"/>



    </properties>

</persistence-unit>

applicationContext

<?xml version="1.0" encoding="UTF-8"?>

<bean id="entityManagerFactory"
	class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="cnjbrasil_rr" />
</bean>
<context:component-scan base-package="br.com.projudi.controller" />
<context:annotation-config />
<bean id="transactionManager"
	class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory"
		ref="entityManagerFactory" />
</bean>
<tx:annotation-driven />
<bean id="categoriaDao" class="br.com.projudi.dao.imp.CategoriaDaoImp" />
<bean id="parteDao" class="br.com.projudi.dao.imp.ParteDaoImp" />
<bean id="tipoCertidaoDao" class="br.com.projudi.dao.imp.TipoCertidaoDaoImp" />
<bean id="certidaoDao" class="br.com.projudi.dao.imp.CertidaoDaoImp" />

Alguêm poderia me ajudar?!

5 Respostas

T

Situação no mínimo estranha, mas… se vc não separa em 2 projetos,e as tabelas tem o mesmo nome nas duas bases, vc pode ter é 2 persistence Units.

J

A aplicação devera se conectar as pelo menos 5 bancos sendo que um deles é totalmente diferente os outros são identicos e estão apenas em servidores separados. Eu poderia configurar as conexões nos arquivos XML?

T

eu não entendi bem o porque disso tudo ainda, MAS…

pense em usar:

replicação de DBMS, (hj em dia qqer SGBD que prestem e alguns que não prestam tem esse recurso).

2- Se não funcionar a gambi do hibernate, dá uma olhada no hibernate SHARDS. Ve se te ajuda…

Se eu soubesse exatamente o porque dessa distribuiçao do banco daria para ajudar mais. abs

J

Cheguei na seguinte solução. (ainda não definitiva mas funciona para o que eu quero):

Em emu arquivo applicationContext adicionei 3 entityManagerFactory:



<bean id="entityManagerFactorysiscom"
	class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="bd2" />
</bean>

<bean id="entityManagerFactorysolbva"
	class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="bd3" />
</bean>

e na minha generi DAO faço as seguinte referencias:

@PersistenceContext(unitName = “bd1”)
private EntityManager embd1;

@PersistenceContext(unitName = “bd2”)
private EntityManager embd2;

@PersistenceContext(unitName = “bd3”)
private EntityManager embd3;

exemplo do método de persistência?

@SuppressWarnings(unchecked)

public List todos(int con) {

String queryS = SELECT obj FROM " + oClass.getSimpleName() + " obj;

Query query = null;

if (con == 1) {

query = getEmbd1().createQuery(queryS);

}

if (con == 2) {

query = getEmbd2().createQuery(queryS);

}

f (con == 3) {

query = getEmbd3().createQuery(queryS);

}
return query.getResultList();

}

Esta solução não é definitiva…mas com testes consegui trazer dados de 3 bancos diferentes.

J

Encontrei uma maneira melhor para as conexões. Utilizei uma forma dinâmica:

public EntityManager getManager(String con) {

Map properties = new HashMap();

if (con.equals(CONEXAO_A)) {

properties.put(hibernate.connection.url, jdbc:oracle:thin:@XX.XX.X.XX:1521:Z);

} else if (con.equals(CONEXAO_B)) {

properties.put(hibernate.connection.url, jdbc:oracle:thin:@XX.XX.X.XX:1521:Z);

} else if (con.equals(CONEXAO_C)) {

properties.put(hibernate.connection.url, jdbc:oracle:thin:@XX.XX.X.XX:1521:Z);

} else {

manager.close();

}

properties.put(hibernate.dialect, org.hibernate.dialect.OracleDialect);

properties.put(hibernate.connection.driver_class, oracle.jdbc.driver.OracleDriver);

properties.put(hibernate.connection.username, usuario);

properties.put(hibernate.connection.password, senha);

EntityManagerFactory factory = Persistence.createEntityManagerFactory(bd, properties);

manager = factory.createEntityManager();

return manager;

}
Criado 22 de janeiro de 2010
Ultima resposta 10 de fev. de 2010
Respostas 5
Participantes 2