SlideShare uma empresa Scribd logo
1 de 34
Baixar para ler offline
André	
  Luiz	
  Forchesatto	
  
Helder	
  Da	
  Rocha	
  
•  Orientação	
  a	
  objetos	
  
–  Abstração	
  
–  Reuso	
  
–  Produtividade	
  
•  Banco	
  de	
  dados	
  relacional	
  
–  Eficiência	
  
–  Confiabilidade;	
  
–  Grande	
  número	
  de	
  empresas	
  utilizando	
  
¡  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;	
  
¡  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
¡  Granularidade	
  
¡  Subtipos	
  (Herança)	
  
¡  Identidade	
  
¡  Associações	
  
¡  Navegação	
  em	
  grafos	
  
¡  obj.getA().getB()	
  
¡  Como	
  isto	
  se	
  comporta	
  em	
  uma	
  aplicação	
  em	
  
Java	
  
§  Transiente	
  
§  Persistente	
  
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
•  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	
  
¡  Módulos	
  globais	
  do	
  sistema:	
  
§  Gestão	
  de	
  indivíduos;	
  
§  Gestão	
  de	
  cursos;	
  
§  Procedimentos	
  acadêmicos;	
  
§  Emissão	
  de	
  documentos;	
  
¡  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;	
  
¡  Jmeter	
  :	
  
§  Eficiência	
  (req/min)	
  
§  Espera	
  Média	
  
§  Espera	
  Mediana	
  
§  Espera	
  Picos	
  
¡  Logs	
  Hibernate	
  para	
  quantidade	
  sql;	
  
	
  
¡  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;	
  
¡  Estratégias	
  de	
  recuperação	
  de	
  dados	
  para	
  
associações	
  
¡  N+1	
  registros	
  nas	
  associações;	
  
¡  Produto	
  cartesiano;	
  
¡  Immediate	
  Fetching	
  	
  
§  Vários	
  Selects	
  
¡  Eager	
  Fetching	
  	
  
§  Única	
  busca	
  join	
  
¡  Lazy	
  Fetching	
  	
  
§  Somente	
  quando	
  necessário	
  
¡  Batch	
  Fetching	
  	
  
§  Melhoria	
  da	
  estratégia	
  Lazy.	
  
¡  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)	
  
¡  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	
  =	
  ?	
  
	
  
	
  
¡  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)	
  
¡  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
)	
  
¡  Nível	
  de	
  busca	
  :	
  
§  “from	
  cursoMatriz	
  cm	
  left	
  join	
  cm.disciplina”	
  
¡  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	
  
¡  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
)	
  
¡  Forçar	
  a	
  inicialização	
  de	
  proxy	
  
§  Hibernate.initizalize(curso.getDisciplinas())	
  
Melhoria	
  
Eficiência	
  (req/min)	
   21%	
  
Espera	
  Média	
   71%	
  
Espera	
  Mediana	
   164%	
  
Espera	
  Picos	
   61%	
  
¡  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;	
  
¡  Exemplo	
  de	
  utilização:	
  
§  “	
  Select	
  new	
  ForumVO	
  (	
  f.assunto,	
  f.autor,	
  
f.data)	
  from	
  Forum	
  ”	
  
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%	
  
¡  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	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
}	
  
¡  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),...	
  
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
André	
  Luiz	
  Forchesatto	
  
andreforchesatto@gmail.com	
  
Helder	
  da	
  Rocha	
  
helder.darocha@gmail.com	
  
	
  
andreforchesatto@gmail.com	
  

Mais conteúdo relacionado

Semelhante a Jj08 otimizacao

PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPiMasters
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
Produtividade em Java com Grails
Produtividade em Java com GrailsProdutividade em Java com Grails
Produtividade em Java com GrailsWanderson Oliveira
 
Design Patterns para Tuning Pentaho com Ctools
Design Patterns para Tuning Pentaho com CtoolsDesign Patterns para Tuning Pentaho com Ctools
Design Patterns para Tuning Pentaho com Ctoolse-Setorial
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaAlexandre Tarifa
 
Elastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreElastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreRafael Gomes
 
Desenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveiselliando dias
 
Python mudando o modo de desenvolver para a internet
Python mudando o modo de desenvolver para a internetPython mudando o modo de desenvolver para a internet
Python mudando o modo de desenvolver para a internetMarcos Petry
 
Python mudando o modo de desenvolver para a web - Marcos Daniel Petry
Python mudando o modo de desenvolver para a web  - Marcos Daniel PetryPython mudando o modo de desenvolver para a web  - Marcos Daniel Petry
Python mudando o modo de desenvolver para a web - Marcos Daniel PetryTchelinux
 
Novidades do Django 1.2
Novidades do Django 1.2Novidades do Django 1.2
Novidades do Django 1.2flavioamieiro
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdoJorge Luís Gregório
 
Joomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisJoomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisrafaelberlanda
 
FEUCTEC 2016 - Hub de eventos com redis
FEUCTEC 2016 - Hub de eventos com redisFEUCTEC 2016 - Hub de eventos com redis
FEUCTEC 2016 - Hub de eventos com redisCharles Lomboni
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHPRangel Javier
 

Semelhante a Jj08 otimizacao (20)

Doctrine for dummies
Doctrine for dummiesDoctrine for dummies
Doctrine for dummies
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Produtividade em Java com Grails
Produtividade em Java com GrailsProdutividade em Java com Grails
Produtividade em Java com Grails
 
Design Patterns para Tuning Pentaho com Ctools
Design Patterns para Tuning Pentaho com CtoolsDesign Patterns para Tuning Pentaho com Ctools
Design Patterns para Tuning Pentaho com Ctools
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escalaTécnicas e recursos para desenvolvimento Web em cenários de grande escala
Técnicas e recursos para desenvolvimento Web em cenários de grande escala
 
Elastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreElastic MeetUp Porto Alegre
Elastic MeetUp Porto Alegre
 
Desenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveis
 
Python mudando o modo de desenvolver para a internet
Python mudando o modo de desenvolver para a internetPython mudando o modo de desenvolver para a internet
Python mudando o modo de desenvolver para a internet
 
Python mudando o modo de desenvolver para a web - Marcos Daniel Petry
Python mudando o modo de desenvolver para a web  - Marcos Daniel PetryPython mudando o modo de desenvolver para a web  - Marcos Daniel Petry
Python mudando o modo de desenvolver para a web - Marcos Daniel Petry
 
Novidades do Django 1.2
Novidades do Django 1.2Novidades do Django 1.2
Novidades do Django 1.2
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
 
Code Smells
Code SmellsCode Smells
Code Smells
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1
 
Joomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisJoomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portais
 
FEUCTEC 2016 - Hub de eventos com redis
FEUCTEC 2016 - Hub de eventos com redisFEUCTEC 2016 - Hub de eventos com redis
FEUCTEC 2016 - Hub de eventos com redis
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHP
 

Mais de Helder da Rocha

Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsHelder da Rocha
 
Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Helder da Rocha
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosHelder da Rocha
 
Padrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasPadrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasHelder da Rocha
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a WebHelder da Rocha
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosHelder da Rocha
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Helder da Rocha
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8Helder da Rocha
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Helder da Rocha
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Helder da Rocha
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)Helder da Rocha
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsHelder da Rocha
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: SincronizadoresHelder da Rocha
 

Mais de Helder da Rocha (20)

Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.js
 
Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativos
 
Padrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasPadrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemas
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a Web
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativos
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8
 
Java 9, 10, 11
Java 9, 10, 11Java 9, 10, 11
Java 9, 10, 11
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: Sincronizadores
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 

Jj08 otimizacao

  • 1. André  Luiz  Forchesatto   Helder  Da  Rocha  
  • 2. •  Orientação  a  objetos   –  Abstração   –  Reuso   –  Produtividade   •  Banco  de  dados  relacional   –  Eficiência   –  Confiabilidade;   –  Grande  número  de  empresas  utilizando  
  • 3. ¡  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;  
  • 4. ¡  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
  • 5. ¡  Granularidade   ¡  Subtipos  (Herança)   ¡  Identidade   ¡  Associações   ¡  Navegação  em  grafos  
  • 6. ¡  obj.getA().getB()   ¡  Como  isto  se  comporta  em  uma  aplicação  em   Java   §  Transiente   §  Persistente  
  • 7. 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
  • 8. •  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  
  • 9. ¡  Módulos  globais  do  sistema:   §  Gestão  de  indivíduos;   §  Gestão  de  cursos;   §  Procedimentos  acadêmicos;   §  Emissão  de  documentos;  
  • 10. ¡  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;  
  • 11. ¡  Jmeter  :   §  Eficiência  (req/min)   §  Espera  Média   §  Espera  Mediana   §  Espera  Picos   ¡  Logs  Hibernate  para  quantidade  sql;    
  • 12. ¡  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;  
  • 13. ¡  Estratégias  de  recuperação  de  dados  para   associações   ¡  N+1  registros  nas  associações;   ¡  Produto  cartesiano;  
  • 14. ¡  Immediate  Fetching     §  Vários  Selects   ¡  Eager  Fetching     §  Única  busca  join   ¡  Lazy  Fetching     §  Somente  quando  necessário   ¡  Batch  Fetching     §  Melhoria  da  estratégia  Lazy.  
  • 15. ¡  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)  
  • 16. ¡  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  =  ?      
  • 17. ¡  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)  
  • 18. ¡  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 )  
  • 19. ¡  Nível  de  busca  :   §  “from  cursoMatriz  cm  left  join  cm.disciplina”  
  • 20.
  • 21. ¡  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  
  • 22. ¡  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 )  
  • 23. ¡  Forçar  a  inicialização  de  proxy   §  Hibernate.initizalize(curso.getDisciplinas())  
  • 24.
  • 25. Melhoria   Eficiência  (req/min)   21%   Espera  Média   71%   Espera  Mediana   164%   Espera  Picos   61%  
  • 26. ¡  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;  
  • 27. ¡  Exemplo  de  utilização:   §  “  Select  new  ForumVO  (  f.assunto,  f.autor,   f.data)  from  Forum  ”  
  • 28.
  • 29.
  • 30. 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%  
  • 31. ¡  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                          }   }  
  • 32. ¡  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),...  
  • 33. 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
  • 34. André  Luiz  Forchesatto   andreforchesatto@gmail.com   Helder  da  Rocha   helder.darocha@gmail.com     andreforchesatto@gmail.com