Tecnologia em Análise e Desenvolvimento de Sistemas
Por: Tiago Cardoso • 25/8/2017 • Exam • 1.134 Palavras (5 Páginas) • 256 Visualizações
Curso: Tecnologia em Análise e Desenvolvimento de Sistemas
Disciplina: PPR003 - Padrões de Projetos
Professor: Leandro Costa Souza
Aluno: _________________________________ Data: 21/08/2017
Prova 1
⦁ Leia atentamente sua prova;
⦁ Responda as questões apenas na área reservada para isso;
⦁ Modelar e criar código de uma solução para um aplicativo que irá precisar atender uma quantidade enorme de usuários simultâneos.
Descreva uma solução para ganhar tempo na conexão com o banco de dados fazendo um reaproveitamento de conexões já abertas previamente. Nessa solução deve ser possível alternar, enquanto a aplicação estiver rodando, a maneira de gerenciar a criação/liberação/restrição de novas conexões.
O "reaproveitardor" não deve se preocupar com a forma como as conexões serão gerenciadas e devem existir pelo menos 3 maneiras diferentes de gerenciamento. O primeiro deve usar uma pilha (padrão) para gerenciar as conexões, o outro um fila e o terceiro uma ordem aleatória.
Para a construção de um novo tipo de gerenciamento deve ser necessário apenas se basear no gerenciador padrão e definir uma estrutura de dados ( da mesma maneira que foi feito para o fila e o aleatória).
Quando o gerenciamento for alterado no "reaproveitardor" isso deve ser refletido para a aplicação toda.
Resposta:
Para criar o reaproveitador o padrão utilizado será Object Pool.
A classe ConexaoPadraoPool tem um atributo conexoes do tipo List de conexoes, onde no construtor é definido que esse atributo será uma LinkedList e várias conexões são adicionadas nela. Nessa classe também é definido o método aquire que entrega para o cliente a última conexão da LinkedList, e o método release que adiciona na LinkedList a conexao devolvida.
ConexaoFilaPool é uma classe filha de ConexaoPadraoPool que também define no contrutor o atributo conexoes como LinkedLinked e e várias conexões são adicionadas nela, contudo o método aquire é reescrito para que devolva para o cliente a primeira conexao.
ConexaoAleatoriaPool também é filha de ConexaoPadraoPool e define no construtor um ArrayList e várias conexões são adicionadas nele, e o método aquire é reescrito para que devolva para o cliente uma conexão aleatória.
public interface Pool<T> {
T aquire();
void release(T t);
}
public class ConexaoPadraoPool implements Pool<Conexao> {
protected List<Conexao> conexoes;
public ConexaoPadraoPool() {
this.conexoes = new LinkedList<Conexao>();
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
this.conexoes.add(new Conexao("//string de conexao no banco de dados"));
}
@Override
public Conexao aquire() {
if(this.conexoes.size() > 0) {
return this.conexoes.remove(this.conexoes.size() - 1);
} else {
return null;
}
}
@Override
public void release(Conexao c) {
this.conexoes.add(c);
}
}
public class ConexaoFilaPool extends ConexaoPadraoPool {
public ConexaoFilaPool() {
this.conexoes = new LinkedList<Conexao>();
this.conexoes.add(new Conexao("//string
...