[Resolvido] Ajuda para acesso a banco de dados

PessoALL, bom dia.

Preciso de uma ajuda com um ideia para acesso a base de dados de um sistema, e qualquer ajuda será bem vinda.

Hoje, tenho um sistema que funciona basicamente desta foma - um cliente acessa meu sistema web, para ter acesso aos dados da empresa dele - para isso utilizo uma configuração feita em um arquivo XML para definição da estrutura da JPA, onde informo o usuário, senha, schema de banco, etc… para o acesso à essa parte “comum” à todos os meus clientes. Tudo isso está funcionando perfeitamente bem, tenho um entity manager estatico, baixo custo de memória, acesso à disco, enfim… nenhum problema nessa estrutura.

Agora, preciso estender essa estrutura de acesso para permitir que, a partir dessa parte comum do meu sistema (em que todos os clientes acessam), cada cliente possa acessar uma área específica do meu sistema, em um servidor próprio para cada cliente, com schemas diferentes para cada cliente, usuários e senhas diferentes, etc…

O problema é justamente como definir essa estrutura de acesso da JPA para permitir esse tipo de trabalho.

Como eu poderia criar uma classe estática que permitisse que cada objeto tivesse acesso à uma única entidade de gerenciamento do acesso ao banco, específico para cada cliente?

Pensei em criar uma classe mais ou menos assim:

public class AcessaBanco() {
    private static final EntityManagerFactory emf;
    public AcessaBanco() {
        // aqui faria o acesso diretamente ao arquivo de configuração e setaria os campos usuário, senha, etc, para acesso ao banco de dados
    }

    public AcessaBanco(String senha, String banco, String usuario, String host, String porta, String nomeSchema) {

        //aqui recebo os campos e defino o acesso ao banco de dados
    }
}

só que aí, nessa classe, como eu faria com o acesso estático ao objeto emf acima? Note que o objeto emf, sendo estático, tenho um custo de acesso relativamente baixo à estrutura do banco de dados.

Se eu tiver que instanciar esse objeto toda hora, esse custo ficaria relativamente caro, devido às inúmeras classes que precisam ser persistidas no banco de dados.

Como vocês pensam ser a solução ideal, para esse caso, em que eu preciso ter acesso à banco de dados diferentes, para cada cliente, mas mesmo assim mantendo os objetos com baixo custo de acesso ao banco de dados?

Bom dia
gapler,

Se eu entendi bem a sua necessidade, junto com um rascunho do código, você necessita criar um isolamento dos dados dos clientes para que “n” clientes acessem a mesma instância do sistema. Essa arquitetura chama Multi-tenancy ou multi-inquilino que é usada em SaaS, essa arquitetura permite isolar os dados em 3 níveis basicamente.

  1. Base da dados e esquemas compartilhados : cada inquilino é identificado pelo próprio id em todos os registros (não é muito legal não);

  2. Base de dados compartilhada com esquema separado: começou a melhorar o sistema continua conectando em uma única base de dados porém ao o cliente ao acessar é direcionado ao esquema correspondente;

  3. Base de dados separadas : isolamento máximo ao autenticar o usuário é feita a conexão com seu banco de dados específico;

Dá uma olhada nessa implementação
Jboss - Multi-tenancy

att,

1 curtida

Obrigado, Robson…

eu acabei implementando o recurso de uma forma não tão prática assim… mas está funcionando.

Mas, irei dar uma aprofundada no material que enviou. Creio que a mudança não será grande, e será muito melhor do que a que eu criei.

obrigado!