[Resolvido] Dúvida em usar classe Fachada como Singleton

Olá,

Fiz um aplicativo web, onde para facilitar criei uma classe que retorna variáveis de instância dos DAOs, faz mais ou menos o seguinte:

public class Fachada {                           

       //A classe TabelaA tem métodos para manipular a tabela A       
       private TabelaA tabelaA;

       //A classe TabelaB tem métodos para manipular a tabela B       
       private TabelaB tabelaB;

       //Construtor
       public Fachada() {        }  

      public TabelaA getTabelaA {       
       tabelaA = new TabelaA();
       return this.tabelaA;     
     } //fim getTabelaA

     public TabelaB getTabelaB {
          tabelaB = new TabelaB();
          return this.tabelaB;
     } //fim getTabelaB

} //fim classe

Porém, cada controlador instancia um objeto do tipo Fachada para si e, tendo em vista a economia de memória e o custo da geração de novos objetos, acho que ficaria melhor se todos compartilhassem um único, como por exemplo:

public class Fachada {              

       private static Fachada instancia = new Fachada();  
       
       //variável para manipular os dados da tabela A
       private TabelaA tabelaA = new TabelaA();

       //variável para manipular os dados da tabela B
       private TabelaB tabelaB = new TabelaB();
      
      //Construtor privado para evitar que seja instanciado
      private Fachada() {        }       

      public static Fachada getInstancia() { return instancia; }

      public TabelaA getTabelaA { return this.tabelaA; }

      public TabelaB getTabelaB { return this.tabelaB; }

} //fim classe

Pelo código acima creio que só terá uma instância de Fachada, a ser compartilhada pelo aplicativo. A pergunta é, se dois controladores adquirirem uma instância do Fachada e, por exemplo, tentarem executar o mesmo método da tabela A simultaneamente… corre o risco de um usuário receber como retorno dados que eram para outro usuário? Ou no caso de um insert ou update, causar inconsistência no banco de dados?

Pensei em adicionar synchronized aos métodos getTabelaA e getTabelaB … Só que ai já pensou se, por exemplo, vários usuários acessarem simultaneamente métodos que fazem operações com a tabela A, ia ter um gargalo, pois penso que ia ser gerada uma fila onde um ia ter que esperar as operações do outro acabarem para poder ter acesso ao método getTabelaA… Então o meu aplicativo iria economizar memória, mas perder performance!

Alguma sugestão?

Acredito que a melhor solução é você utilizar algum framework como o hibernate, procurar mais informações sobre ciclo de vida da aplicação ou objetos, uma vez que vc esta preocupado com performace e integridade de dados, a maioria dos frameworks já possuem implementações para isso, gerenciam pra vc, é mais fácil para manipular, vc também pode optar por webservices(Não tenho certeza), partindo do princípio que são dois Design Patterns diferentes e para propósitos diferentes ficaria um code cabrito, o que talvez pode ser feito é intercambiar os dois, mas voto pela opção de utilizar o framework como solução.

Carinha, o problema aí é mais embaixo… Seus medos são infundados, mas você deveria ter medo de outras coisas…
Vamos botar nome aos bois: você teria, sei lá, um método resultado R = selectAll(Critérios x) no seu Tabela A. Como a sua chamada é síncrona, ou seja, a thread espera para obter uma resposta, esse seu medo de um usuário receber dados de outro não tem fundamento.
E se, por outro lado, seu método, digamos, update(Registros x) da sua classe tabela A cuida de dar um commit, pegar conexões e fechar no fim do procedimento, não tem motivos para haver inconsistência de banco de dados. Se você utiliza somente variáveis locais e os parâmetros de chamadas nesses métodos de exemplo, você não vai ter problema de sincronismo, e pode fazer singleton sim.

A coisa começa a ficar complicada se você depende de duas chamadas diferentes, chamadas em dois momentos distintos. Algo do tipo:

tabelaA.setSaldo(2000);
tabelaA.setNome(“fulano”);
tabelaA.efetuarCredito();

Aí você vai ter rolo, sim: existe risco de ter uma chamada paralela com sicrano e ficar tudo zoado.

Resumindo: se você fizer chamadas atômicas nos seus DAOs, tudo bem. Senão, vai dar rolo…

Agradeço os esclarecimentos, vou testar isso na próxima versão do software…