Conexão multiplos bancos

4 respostas
J

Bom dia!

Estou desenvolvendo uma aplicação que vai conectar em diversos bancos de acordo com um ID informado junto com o login e senha.

Bom, o gerenciamento dessas conexões ja esta funcionando. Porem em alguns testes, percebi que se conecto em bancos diferentes ao mesmo tempo, o Hibernate esta se perdendo entre as conexões (Banco1 e Banco2 por exemplo …)

Estou recuperando a conexão com ThreadLocal e tenho duas classes de gerenciamento de conexões. Uma faz o controle conectando em um banco principal e recuperando as informações de conexão com o banco do cliente e outra classe gerencia a conexão com o cliente.

Se alguem puder me ajudar.

Abraço.

4 Respostas

A

Crie um arquivo de configuração para cada banco, assim ao se autenticar, você direciona ele pra qual conexao vai ser utilizado.
Para configurar à um distinto, basta fazer o Configure pra ele:

SessionFactory sf = new Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
SessionFactory sf2 = new Configuration().configure("/hibernate2.cfg.xml").buildSessionFactory();
J

Oi andre.froes,

Não utilizo hibernate.cfg.xml e sim recupera as configurações dentro da minha classe mesmo …

E as configurações de conexão com os banco do cliente, estão armazenas no banco principal …

Segue a classe que gerencia a conexão com os clientes:

public class ConexaoManager {

	private static SessionFactory factory = null;
	private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	
	private ConexaoManager() {
		AnnotationConfiguration configuration = new AnnotationConfiguration();

        SysCliente cliente = SingletonSistema.getInstance().getCliente();
        if (cliente != null) {
        	System.out.println("setando cliente para conexão: " + cliente.getBancoDados());
        	String conn = "jdbc:postgresql://" + cliente.getIpServidor().trim() + ":" + 
			        		cliente.getPortServidor().trim() + "/" +
			        		cliente.getBancoDados().trim(); 	
        	String user = cliente.getLogin().trim();
        	String senha = cliente.getSenha().trim();
        	
	        //Conexão com o banco
	        configuration.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver");
	        configuration.setProperty("hibernate.connection.url", conn);  
	        configuration.setProperty("hibernate.connection.username", user);  
	        configuration.setProperty("hibernate.connection.password", senha);

	        // mapeamento
	        configuration.addAnnotatedClass(br.com.erp.modelo.Bairro.class);
	        configuration.addAnnotatedClass(br.com.erp.modelo.Cep.class);

	        factory = configuration.buildSessionFactory();
        }
	}
	
	public static Session getSession() throws HibernateException {
	    if (factory == null) {
			new ConexaoManager();
		}
	    Session session = (Session) threadLocal.get();
        if ((session == null) || (!session.isOpen()))
            session = factory.openSession();
        threadLocal.set(session);
		return session;
	}
}

Essa classe SingletonSistema que utilizo na linha 9, é setada apos a conexão com o banco principal (outra classe de gerenciamento)… Pode estar ai o problema … mas nao consegui encontrar.

Agradeço sua ajuda.

J

O problema esta com minha classe Singleton mesmo, pois quando realizo um novo login, ela atualiza o novo ID do cliente, perdendo o antigo. Logo a conexão esta sendo mantina de acordo com o ultimo login realizado!

Alguma ideia de como poderia controlar isso?!

J

Realmente meu codigo esta com problema para oq quero fazer …

Acho que o caminho é “Multi-Tenant”.

Valeu.

Criado 13 de outubro de 2010
Ultima resposta 13 de out. de 2010
Respostas 4
Participantes 2