Jj08 otimizacao
-
Upload
helder-da-rocha -
Category
Technology
-
view
62 -
download
2
Transcript of Jj08 otimizacao
![Page 1: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/1.jpg)
André Luiz Forchesatto Helder Da Rocha
![Page 2: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/2.jpg)
• Orientação a objetos – Abstração – Reuso – Produtividade
• Banco de dados relacional – Eficiência – Confiabilidade; – Grande número de empresas utilizando
![Page 3: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/3.jpg)
¡ Frameworks (ORM) que facilitem o relacionamento entre objeto e relacional;
¡ Criar camadas próprias para persistência; ¡ Sistemas de banco de dados orientado a objeto;
![Page 4: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/4.jpg)
¡ Tempo de configuração § Classes mapeadas a tabelas (esquemas)
¡ Tempo de execução § Instâncias (objetos) automaticamente mapeadas a registros
conta correntista saldo
1 Gargantua 1370
2 Pantagruel 3450
3 Gargamel 800
4 Morticia 8200
Classe Conta
String codigo String nome double saldo
instância:Conta
codigo="4" nome="Morticia" saldo=8200
Tabela Conta
Banco de Dados Relacional
![Page 5: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/5.jpg)
¡ Granularidade ¡ Subtipos (Herança) ¡ Identidade ¡ Associações ¡ Navegação em grafos
![Page 6: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/6.jpg)
¡ obj.getA().getB() ¡ Como isto se comporta em uma aplicação em Java § Transiente § Persistente
![Page 7: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/7.jpg)
Transiente
Desligado
Persistente
Pessoa
nome = Yoda id = 0
Pessoa id nome
Pessoa
nome = Yoda id = 1
Pessoa id nome 1 Yoda
Pessoa
nome = Jabba id = 1
Pessoa id nome 1 Jabba
Pessoa
nome = Jabba id = 1
Pessoa id nome 1 Jabba
Pessoa
nome = Luke id = 1
Pessoa id nome 1 Jabba
![Page 8: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/8.jpg)
• Aplicação WEB para gerenciamento de Instituições de ensino;
• Características de implementação – Hibernate – Spring – Servidor Tomcat – Banco de dados Oracle
• Padrões – MVC – OpenSessionInView
• Appfuse
![Page 9: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/9.jpg)
¡ Módulos globais do sistema: § Gestão de indivíduos; § Gestão de cursos; § Procedimentos acadêmicos; § Emissão de documentos;
![Page 10: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/10.jpg)
¡ Módulos globais do sistema: § Apoio ao ensino presencial; ▪ Diário on-‐line; ▪ Plano de ensino; ▪ Ferramentas de interação aluno professor
§ Educação a distância ▪ Fóruns; ▪ Tira dúvidas; ▪ Material didático on-‐line; ▪ Avaliação on-‐line;
![Page 11: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/11.jpg)
¡ Jmeter : § Eficiência (req/min) § Espera Média § Espera Mediana § Espera Picos
¡ Logs Hibernate para quantidade sql;
![Page 12: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/12.jpg)
¡ Módulos utilizados no estudo de tempo de espera e eficiência: § Gestão de Indivíduos; § Educação a distância (Fórum); § Apoio ao ensino presencial (Fórum);
¡ Módulos utilizados para contagem de SQL: § Matrícula; § Notas; § Históricos;
![Page 13: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/13.jpg)
¡ Estratégias de recuperação de dados para associações
¡ N+1 registros nas associações; ¡ Produto cartesiano;
![Page 14: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/14.jpg)
¡ Immediate Fetching § Vários Selects
¡ Eager Fetching § Única busca join
¡ Lazy Fetching § Somente quando necessário
¡ Batch Fetching § Melhoria da estratégia Lazy.
![Page 15: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/15.jpg)
¡ Não é aconselhável; ¡ Observar:
§ hibernate.max_fetch_depth – aconselhável valor entre 1 e 5
§ Analisar estratégia de fetch: ▪ Batch-‐Size; ▪ Fetch(Subselect, Join)
![Page 16: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/16.jpg)
¡ Para cada Curso n+1 selects para buscar DisciplinaMatriz
¡ Exemplo: 1 Curso e 5 Disciplinas 1 -‐ Select c.* from curso c 2 – Select dm.* from disciplinaMatriz dm where dm.curso = ? 3 – Select dm.* from disciplinaMatriz dm where dm.curso = ? 4 – Select dm.* from disciplinaMatriz dm where dm.curso = ? 5 – Select dm.* from disciplinaMatriz dm where dm.curso = ?
![Page 17: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/17.jpg)
¡ Nível de mapeamento: § batch-‐size
XML
<set name=“disciplinas” inverse=“true” batch-‐size=“10”>
<key column=“coddismatriz”/> <one-‐to-‐many class= “DisciplinaMatriz”/> </set>
<class name = “DisciplinaMatriz” table=“DIS_MATRIZ” batch-‐size=“10”>
... </class>
ANOTAÇÕES
@BatchSize(size=10)
![Page 18: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/18.jpg)
¡ Nível de mapeamento (apenas Hibernate): § fetch=“subselect”
XML
<set name=“disciplinas” inverse=“true” fetch=“subselect”>
<key column=“coddismatriz”/> <one-‐to-‐many class= “DisciplinaMatriz”/> </set>
ANOTAÇÕES
@Fetch(value=FetchMode.SUBSELECT)
![Page 19: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/19.jpg)
¡ Nível de busca : § “from cursoMatriz cm left join cm.disciplina”
![Page 20: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/20.jpg)
![Page 21: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/21.jpg)
¡ Exemplo: 2 Cursos X 3 Disciplinas = 6 Registros
Curso Disciplina
CodCurso NomCurso CodDisciplina NomDisciplina
1 Informática 1 Algoritmo
1 Informática 2 Java
1 Informática 3 Banco de dados
2 Biologia 1 Genética
2 Biologia 2 Bioinformática
2 Biologia 3 Microbiologia
![Page 22: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/22.jpg)
¡ Não utilizar recuperação ansiosa FetchType.EAGER
¡ Se for necessário utilizar mapear as coleções como fetch=“subselect”
XML
<set name=“disciplinas” inverse=“true” fetch=“subselect”>
<key column=“coddismatriz”/> <one-‐to-‐many class= “DisciplinaMatriz”/> </set>
ANOTAÇÕES
@Fetch(value=FetchMode.SUBSELECT)
![Page 23: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/23.jpg)
¡ Forçar a inicialização de proxy § Hibernate.initizalize(curso.getDisciplinas())
![Page 24: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/24.jpg)
![Page 25: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/25.jpg)
Melhoria Eficiência (req/min) 21% Espera Média 71% Espera Mediana 164% Espera Picos 61%
![Page 26: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/26.jpg)
¡ Utilizado para representar dados de transferência entre camadas da arquitetura;
¡ Posso criar um ValueObject que represente uma tela, um relatório, uma consulta, etc..
¡ Aplicados no contexto de otimização de busca, faz com que sejam processados somente campos necessário na busca;
¡ Elemina-‐se o problema de LazyInitialize;
![Page 27: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/27.jpg)
¡ Exemplo de utilização: § “ Select new ForumVO ( f.assunto, f.autor, f.data) from Forum ”
![Page 28: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/28.jpg)
![Page 29: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/29.jpg)
![Page 30: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/30.jpg)
Melhoria Batch Size Melhoria VO Melhoria Total Eficiência (req/min) 335% 27% 452% Espera Média 401% 47% 634% Espera Mediana 378% 65% 690% Espera Picos 469% 58% 798%
![Page 31: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/31.jpg)
¡ A sessão dura toda a requisição, então ela é aberta no início de um service() ou processRequest() e fechada no final
¡ Funciona em arquiteturas procedurais (por requisição -‐ apenas servlets, sem separação de interesses)
public class MyServlet extends HttpServlet { public void doGet(...) { // abre sessão em try
código da requisição // fecha sessão em finally }
}
![Page 32: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/32.jpg)
¡ Solução para estender a sessão para ter a duração de uma requisição Web em arquiteturas MVC
¡ Soluções comuns usam filtros (javax.servlet.Filter) para abrir e fechar a sessão public class HibernateFilter implements Filter { public void doFilter(...) { // abre sessão filtro.doFilter(...);
// fecha sessão } }
¡ Desvantagens: quebra de encapsulamento e coesão, violação da separação de camadas, aumento do acoplamento entre view e controller (viola MVC),...
![Page 33: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/33.jpg)
Filtro
Front Controller
Action Command
Fachada DAO
JSP
HibernateUtil session + tx
Objeto Persistente
HTML
Filtro fecha transações e sessão no final
sessão é fechada neste ponto
sessões e transações mantidas no thread (com ThreadLocal)
sessão é aberta ou
reaproveitada nas operações
do DAO
![Page 34: Jj08 otimizacao](https://reader038.fdocumentos.com/reader038/viewer/2022110200/55c4a16ebb61eb3d578b45c4/html5/thumbnails/34.jpg)
André Luiz Forchesatto [email protected] Helder da Rocha [email protected] [email protected]