Bom dia pessoal.
Estou precisando desenvolver um sistema onde o usuário vai entrar no site da empresa e fazer seu cadastro, e quando terminar esse cadastro é preciso criar uma nova conexão com um novo banco, isso para cada usuário cadastrado.
deixe-me explicar o motivo: normalmente um banco suporta um numero maximo de conexões. abrir uma conexão por request é exaustivo e pode levar a problemas de performance no seu sistema, ou até não funcionar. o que se faz normalmente é usar um pool de conexões (via c3p0 por exemplo ) assim o hibernate gerencia essas conexões de acordo com o que foi configurado.
vc parece ter um caso de multiplas databases ( sei la pq ) e ai vc tem que criar uma SessionFactory por banco de dados, cada um com uma configuração diferente ( em xml por exemplo ) e ai vc vai ter que usar a SessionFactory correta em cada caso.
E talvez ai vc deva pensar em um pool de conexões por banco.
eu ouvi alguem falar uma vez sobre “Distributed Transaction Managers”, não sei se ajuda ou prejudica o seu caso
isso é um pattern bem incomum - em geral necessario se vc tem um grande volume de dados e precisa fazer sharding de database. do ponto de vista de segurança é questionavel, mas ok. manda quem pode…
tome cuidado com as rotinas de backup e em como vc vai alterar a estrutura do banco no futuro, pq se vc adicionar uma coluna nova vai ter que fazer isso em diversas databases depois.
Pelo que entendi você quer algo como um SaaS, onde eu vou lá para criar uma nova empresa (por exemplo) e ele cria o banco e toda a estrutura necessária para sair operando o sistema, com o login e senha que o cara informar na criação da empresa… claro que você não vai poder deixar isso livre para qualquer um acessar e pode realizar esse procedimento, algum mecanismo de controle “pré-criação” da base você vai precisar ter, como o amigo acima mencionou… alguma moderação… não sei, aí é com você…
Tem várias formas de fazer, ou você guarda uma SQL em um arquivo com toda a estrutura do banco e cria quando for necessário… ou você cria o banco a partir da entidades (o Hibernate faz isso)… ou você pode usar algo como o Flyway… isso para a criação da base…
Você ainda vai precisar criar dinamicamente essa SessionFactory (ou EntityManagerFactory) e armazenar em um pool ou algo assim…
É mais ou menos isso? Posso te ajudar em algum código se quiser…