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?