SlideShare uma empresa Scribd logo
1 de 97
1/97
PGBR2013
Desenvolvendo Otimizado com PostgreSQL e
Programação Orientada a Objetos
Pablo Filetti Moreira
pablo.filetti@gmail.com
2/97
Agenda
● Baixa performance...
● ORM – Mapeamento Objeto/Relacional
● JPA – Java Persistence API
● Hibernate
● Fetching – Eager
● Fetching – Lazy
● Collection Fetching – Lazy
● Collection Fetching – Eager
● Cache do 1º Nível
● Cache do 2º Nível
● DynamicUpdate
● Query com NEW
● Batch Update
● Batch …
● Binários
● Query com FETCH
● BatchSize
3/97
Baixa performance...
Para Fernando Ike de Oliveira
60% Problemas são relacionados ao mau uso de expressões SQL.
20% Problemas são relacionados a má modelagem do BD's.
10% Problemas são relacionados a má configuração do SGDB.
10% Problemas são relacionados a má configuração do SO.
(OLIVEIRA,http://www.midstorm.org/~fike/palestras/tuning_pg_consegi.pdf)
4/97
Baixa performance...
Para Fábio Telles Rodriguez
Por mais que os desenvolvedores reclamem do servidor de banco de dados, em 80% dos casos o
problema está na aplicação e em 20% no SGDB. Não que a aplicação seja ruim em si, mas ela pode
não usar o SGDB de forma eficiente. Existem várias formas de se obter os mesmos dados de forma
ineficiente. Pior, uma consulta que funcionava bem num SGDB pode ter uma performance catastrófica
em outro SGDB. Infelizmente isto pode ocorrer também com migrações para outra versão do mesmo
SGDB. Mesmo assim, a culpa ainda não é do SGDB. A aplicação que tem (infelizmente) de adaptar às
especificidades de cada fornecedor e cada versão.
Na verdade, se formos levar a questão de forma mais ponderada, a lei não seria 80/20, seria 99,9/0,01 .
Isto ocorre por um motivo simples, ajustes de SQL e modelagem podem resultar em ganhos de
performance da ordem de 10, 100 ou até 1000 vezes. Enquanto isso, ajustes no SO e SGDB tem
ganhos da ordem de até 10 vezes. Portanto, antes de mais nada
aprenda a modelar bem e conheça as minúcias do SQL do seu SGDB. Depois aprenda a analisar com
profundidade os planos de execução e reescreva consultas complexas a partir deste tipo de análise.
(RODRIGUES, http://www.midstorm.org/~telles/2008/03/04/12-dicas-para-aprender-a-ajustar-a-
performance-de-bancos-de-dados/)
5/97
Baixa performance...
Para Kenia Milene
65% das causas de baixa performance em Bancos de Dados são causadas pelas aplicações.
Dificilmente temos no mesmo ambiente um DBA Desenvolvedor ou um Desenvolvedor DBA, sendo
assim, muito , mas muito cuidado na criação das consultas.
25% são causados pelos modelos de dados. Banco mal modelado
tende a ser terrível. A melhor forma é normalizar o modelo, com isso
ganhamos economia de espaço e a não repetição dos dados. Porém é necessário uma análise, pois
em relatórios muito grandes não é
aconselhável normalização quando falamos de ganho de performance.
5% são problemas do SGDB, acontece do gerenciador do banco
não ter um algoritmo eficiente, ou não consegue manter as informações necessárias na memória por
tempo eficiente. Atenção na aplicação de patchs e upgrades de versões.
5% são causadas por configurações ou deficiências do Sistema
Operacional. Atenção no fluxo da rede, muitas vezes o servidor esta com uma placa de rede não
adequada para a quantidade de fluxo de
informações que trafega. Verificações de parâmetros de Kernel também são consideráveis, pois o S.O
pode não estar deixando o banco escalonar que influencia no impacto do sistema. (MILENE,
http://keniamilene.wordpress.com/2007/10/25/regras-basicas-de-tuning-de-banco-de-dados/).
6/97
Baixa performance...
Para Claudia Machado
●Sistema operacional, caso tenha sido mal parametrizado;
●SGBD Relacional, por causa de inadequadas configurações relacionadas às
áreas de buffers, organização do logging, alocação de arquivos, entre outros;
●Rede, no caso de impactos no tráfego em razão de processamento de dados
efetuados no servidor ou na rede;
●Modelo físico de dados, em razão de inadequação na definição da estrutura
das tabelas e índices;
●Aplicação, quando ocorrem problemas na estrutura lógica efetuada pelo
programador, o que compreende a linguagem hospedeira e os comandos em
SQL.
(MACHADO,http://linhaseletrasweb.blogspot.com/2010/03/tuning-de-bancos-de-
dados.html)
7/97
A culpa é de quem???
Desenvolvedores
“Este Banco é uma carroça”
DBAs
“Esta aplicação é cheia de
gambiarras”
8/97
ORM – Mapeamento Objeto/Relacional
Por muitos anos, persistência tem sido um tópico quente de debates na
comunidade Java. Muitos desenvolvedores nem mesmo concordam com o
escopo do problema. Será a persistência um problema que já foi resolvido pela
tecnologia relacional e suas extensões como procedimentos armazenados
(stored procedures), ou ele é um problema mais amplo que precisa ser
endereçado por modelos de componentes Java especiais, como os entity beans
(componentes de entidade) do EJB? Devemos escrever à mão até mesmo as
mais primitivas operações CRUD (criar, ler, atualizar, deletar – create, read,
update, delete) em SQL e JDBC, ou esse trabalho deve ser automatizado?
Como alcançamos portabilidade se todo sistema de gerenciamento de banco
de dados possui o seu próprio dialeto SQL? Devemos abandonar o SQL em
definitivo e adotar uma tecnologia diferente de banco de dados, como o sistema
de banco de dados orientado para objetos? O debate continua, mas agora a
solução chamada mapeamento objeto/relacional (ORM – object/relational
mapping) tem uma grande aceitação. (BAUER e KING, 2007, p.4)
9/97
JPA – Java Persistence API
● Especificação
● Providers
● Hibernate
● EclipseLink
● OpenJPA
● TopLink
10/97
Hibernate
O Hibernate é um projeto ambicioso que visa ser uma solução
completa para o problema de gerenciar dados persistentes em
Java. Ele medeia a interação da aplicação com o banco de
dados relacional, deixando o desenvolvedor livre para se
concentrar no problema de negócio que tem nas mãos. O
Hibernate é uma solução não intrusiva. Não é necessário que
você siga muitas das regras e dos padrões de projeto
específicos do Hibernate quanto estiver escrevendo a sua
lógica de negócio e suas classes persistentes; é por essa razão
que o Hibernate se integra tranquilamente à maioria das novas
e existentes aplicações e não necessita de mudanças
incômodas ao resto da aplicação. (BAUER e KING, 2007, p.4)
11/97
Hibernate
● Produtivade
● Multibanco
● Sem SQL
● Criteria + JPQL (HQL)
● Cache
● Envers – Auditoria
● Hibernate Statistics
12/97
Fetching – Classe Produto
13/97
Fetching – Eager
14/97
Fetching – Eager
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
15/97
Fetching – Mapeamento Lazy
16/97
Fetching – Lazy
17/97
Fetching – Lazy
select
produtofet0_.id as id1_0_,
produtofet0_.descricao as descricao1_0_,
produtofet0_.fabricante_id as fabricante5_1_0_,
produtofet0_.nome as nome1_0_,
produtofet0_.tipo_id as tipo6_1_0_,
produtofet0_.valor as valor1_0_
from
public.produto produtofet0_
where
produtofet0_.id=?
select
produtofet0_.id as id1_0_,
produtofet0_.descricao as descricao1_0_,
produtofet0_.fabricante_id as fabricante5_1_0_,
produtofet0_.nome as nome1_0_,
produtofet0_.tipo_id as tipo6_1_0_,
produtofet0_.valor as valor1_0_
from
public.produto produtofet0_
where
produtofet0_.id=?
18/97
Fetching – Lazy
select
fabricante0_.id as id0_0_,
fabricante0_.nome as nome0_0_
from
public.fabricante fabricante0_
where
fabricante0_.id=?
select
fabricante0_.id as id0_0_,
fabricante0_.nome as nome0_0_
from
public.fabricante fabricante0_
where
fabricante0_.id=?
19/97
Fetching – Lazy
select
tipoprodut0_.id as id2_0_,
tipoprodut0_.descricao as descricao2_0_
from
public.tipo_produto tipoprodut0_
where
tipoprodut0_.id=?
select
tipoprodut0_.id as id2_0_,
tipoprodut0_.descricao as descricao2_0_
from
public.tipo_produto tipoprodut0_
where
tipoprodut0_.id=?
20/97
Collection Fetching – Classe Fabricante
21/97
Collection Fetching – Lazy
select
fabricante0_.id as id0_0_,
fabricante0_.nome as nome0_0_
from
public.fabricante fabricante0_
where
fabricante0_.id=?
select
fabricante0_.id as id0_0_,
fabricante0_.nome as nome0_0_
from
public.fabricante fabricante0_
where
fabricante0_.id=?
22/97
Collection Fetching – Lazy
select
produtos0_.fabricante_id as fabricante5_0_2_,
produtos0_.id as id2_,
produtos0_.id as id1_1_,
produtos0_.descricao as descricao1_1_,
produtos0_.fabricante_id as fabricante5_1_1_,
produtos0_.nome as nome1_1_,
produtos0_.tipo_id as tipo6_1_1_,
produtos0_.valor as valor1_1_,
tipoprodut1_.id as id2_0_,
tipoprodut1_.descricao as descricao2_0_
from
public.produto produtos0_
inner join
public.tipo_produto tipoprodut1_
on produtos0_.tipo_id=tipoprodut1_.id
where
produtos0_.fabricante_id=?
select
produtos0_.fabricante_id as fabricante5_0_2_,
produtos0_.id as id2_,
produtos0_.id as id1_1_,
produtos0_.descricao as descricao1_1_,
produtos0_.fabricante_id as fabricante5_1_1_,
produtos0_.nome as nome1_1_,
produtos0_.tipo_id as tipo6_1_1_,
produtos0_.valor as valor1_1_,
tipoprodut1_.id as id2_0_,
tipoprodut1_.descricao as descricao2_0_
from
public.produto produtos0_
inner join
public.tipo_produto tipoprodut1_
on produtos0_.tipo_id=tipoprodut1_.id
where
produtos0_.fabricante_id=?
23/97
Collection Fetching – Mapeamento Eager
24/97
Collection Fetching – Eager
25/97
Collection Fetching – Eager
Hibernate:
select
fabricante0_.id as id0_2_,
fabricante0_.nome as nome0_2_,
produtos1_.fabricante_id as fabricante5_0_4_,
produtos1_.id as id4_,
produtos1_.id as id1_0_,
produtos1_.descricao as descricao1_0_,
produtos1_.fabricante_id as fabricante5_1_0_,
produtos1_.nome as nome1_0_,
produtos1_.tipo_id as tipo6_1_0_,
produtos1_.valor as valor1_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.fabricante fabricante0_
left outer join
public.produto produtos1_
on fabricante0_.id=produtos1_.fabricante_id
left outer join
public.tipo_produto tipoprodut2_
on produtos1_.tipo_id=tipoprodut2_.id
where
fabricante0_.id=?
Hibernate:
select
fabricante0_.id as id0_2_,
fabricante0_.nome as nome0_2_,
produtos1_.fabricante_id as fabricante5_0_4_,
produtos1_.id as id4_,
produtos1_.id as id1_0_,
produtos1_.descricao as descricao1_0_,
produtos1_.fabricante_id as fabricante5_1_0_,
produtos1_.nome as nome1_0_,
produtos1_.tipo_id as tipo6_1_0_,
produtos1_.valor as valor1_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.fabricante fabricante0_
left outer join
public.produto produtos1_
on fabricante0_.id=produtos1_.fabricante_id
left outer join
public.tipo_produto tipoprodut2_
on produtos1_.tipo_id=tipoprodut2_.id
where
fabricante0_.id=?
26/97
Cache de 1º Nível – 1º Exemplo
27/97
Cache de 1º Nível – 1º Exemplo
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
28/97
Cache de 1º Nível – 1º Exemplo
Não faz consulta no BD.
A Entidade esta no Cache de 1º Nível
Não faz consulta no BD.
A Entidade esta no Cache de 1º Nível
29/97
Cache de 1º Nível – 1º Exemplo
HashCode pri. produto: 1262837020HashCode pri. produto: 1262837020
30/97
Cache de 1º Nível – 1º Exemplo
HashCode seg. produto: 1262837020HashCode seg. produto: 1262837020
31/97
Cache de 1º Nível – 1º Exemplo
Resultado da comparação equals: trueResultado da comparação equals: true
32/97
Cache de 1º Nível – 1º Exemplo
Resultado da comparação equals: trueResultado da comparação equals: true
33/97
Cache de 1º Nível – 2º Exemplo
34/97
Cache de 1º Nível – 2º Exemploselect
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
35/97
Cache de 1º Nível – 2º Exemplo
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
36/97
Cache de 1º Nível – 2º Exemplo
HashCode pri. usuário: 1520159108HashCode pri. usuário: 1520159108
37/97
Cache de 1º Nível – 2º Exemplo
HashCode seg. usuário: 1147380142HashCode seg. usuário: 1147380142
38/97
Cache de 1º Nível – 2º Exemplo
Resultado da comparação equals: falseResultado da comparação equals: false
39/97
Cache de 2º Nível
Providers
● EhCache
● OSCache
● Terracotta
● Infinispan
40/97
Cache de 2º Nível – Persistence.xml
41/97
Cache de 2º Nível – Mapeamento Cache
42/97
Cache de 2º Nível – Estratégias
● READ_ONLY - Esta é a estratégia mais restritiva, indicada para entidades
que são apenas lidas e nunca modificadas pela aplicação.
● READ_WRITE - A estratégia leitura e escrita é a mais abrangente e suporta
escrita mais frequente, garantido que a última versão do cache é a mesma do
banco.
● NONSTRICT_READ_WRITE - Indicada para objetos que são raramente
atualizados e que têm probabilidade de atualizações simultâneas muito baixas
e é a mais comum. Caso muitas atualizações ocorram "simultaneamente"
pode ser que a última versão comitada no banco não seja a mesma que
acabou ficando no seu cache.
● TRANSACTIONAL - É totalmente transacional, com suporte a caches
distribuídos. Poucos providers oferecem esse suporte. O provider EhCache
não tem suporte a esta estratégia.
43/97
Cache de 2º Nível – 1º Exemplo
44/97
Cache de 2º Nível – 1º Exemplo
select
tipoprodut0_.id as id2_0_,
tipoprodut0_.descricao as descricao2_0_
from
public.tipo_produto tipoprodut0_
where
tipoprodut0_.id=?
select
tipoprodut0_.id as id2_0_,
tipoprodut0_.descricao as descricao2_0_
from
public.tipo_produto tipoprodut0_
where
tipoprodut0_.id=?
45/97
Cache de 2º Nível – 1º Exemplo
Não faz consulta no BD.
A Entidade esta no Cache de 2º Nível
Não faz consulta no BD.
A Entidade esta no Cache de 2º Nível
46/97
Cache de 2º Nível – 1º Exemplo
HashCode pri. tipo de produto: 480476266HashCode pri. tipo de produto: 480476266
47/97
Cache de 2º Nível – 1º Exemplo
HashCode seg. tipo de produto: 1142116702HashCode seg. tipo de produto: 1142116702
48/97
Cache de 2º Nível – 1º Exemplo
Resultado da comparação equals: falseResultado da comparação equals: false
49/97
Cache de 2º Nível – 2º Exemplo
50/97
Cache de 2º Nível – 2º Exemplo
select
tipoprodut0_.id as id2_,
tipoprodut0_.descricao as descricao2_
from
public.tipo_produto tipoprodut0_
select
tipoprodut0_.id as id2_,
tipoprodut0_.descricao as descricao2_
from
public.tipo_produto tipoprodut0_
51/97
Cache de 2º Nível – 2º Exemplo
Não faz consulta no BD.
A Entidade esta no Cache de 2º Nível
Não faz consulta no BD.
A Entidade esta no Cache de 2º Nível
52/97
Cache de 2º Nível – 2º Exemplo
Não faz consulta no BD.
A Entidade esta no Cache de 2º Nível
Não faz consulta no BD.
A Entidade esta no Cache de 2º Nível
53/97
DynamicUpdate – 1º Exemplo
54/97
DynamicUpdate – 1º Exemplo
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
55/97
DynamicUpdate – 1º Exemplo
update
public.produto
set
descricao=?,
fabricante_id=?,
nome=?,
tipo_id=?,
valor=?
where
id=?
update
public.produto
set
descricao=?,
fabricante_id=?,
nome=?,
tipo_id=?,
valor=?
where
id=?
56/97
DynamicUpdate – Mapeamento
57/97
DynamicUpdate – 2º Exemplo
58/97
DynamicUpdate – 2º Exemplo
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
select
produto0_.id as id1_2_,
produto0_.descricao as descricao1_2_,
produto0_.fabricante_id as fabricante5_1_2_,
produto0_.nome as nome1_2_,
produto0_.tipo_id as tipo6_1_2_,
produto0_.valor as valor1_2_,
fabricante1_.id as id0_0_,
fabricante1_.nome as nome0_0_,
tipoprodut2_.id as id2_1_,
tipoprodut2_.descricao as descricao2_1_
from
public.produto produto0_
inner join
public.fabricante fabricante1_
on produto0_.fabricante_id=fabricante1_.id
inner join
public.tipo_produto tipoprodut2_
on produto0_.tipo_id=tipoprodut2_.id
where
produto0_.id=?
59/97
DynamicUpdate – 2º Exemplo
update
public.produto
set
nome=?
where
id=?
update
public.produto
set
nome=?
where
id=?
60/97
Query com NEW – 1º Exemplo
61/97
Query com NEW – 1º Exemplo
62/97
Query com NEW – 1º Exemplo
select
produto0_.id as id1_,
produto0_.descricao as descricao1_,
produto0_.fabricante_id as fabricante5_1_,
produto0_.nome as nome1_,
produto0_.tipo_id as tipo6_1_,
produto0_.valor as valor1_
from
public.produto produto0_
order by
produto0_.nome
select
produto0_.id as id1_,
produto0_.descricao as descricao1_,
produto0_.fabricante_id as fabricante5_1_,
produto0_.nome as nome1_,
produto0_.tipo_id as tipo6_1_,
produto0_.valor as valor1_
from
public.produto produto0_
order by
produto0_.nome
63/97
Query com NEW – 2º Exemplo
64/97
Query com NEW – 2º Exemplo
65/97
Query com NEW – 2º Exemplo
select
produto0_.id as col_0_0_,
produto0_.nome as col_1_0_
from
public.produto produto0_
order by
produto0_.nome
select
produto0_.id as col_0_0_,
produto0_.nome as col_1_0_
from
public.produto produto0_
order by
produto0_.nome
66/97
Batch Update – 1º Exemplo
67/97
Batch Update – 1º Exemplo
Hibernate:
select
produto0_.id as id1_,
produto0_.descricao as descricao1_,
produto0_.fabricante_id as fabricante5_1_,
produto0_.nome as nome1_,
produto0_.tipo_id as tipo6_1_,
produto0_.valor as valor1_
from
public.produto produto0_
Para cada item do resultado acima faz:
Hibernate:
select
fabricante0_.id as id0_0_,
fabricante0_.nome as nome0_0_
from
public.fabricante fabricante0_
where
fabricante0_.id=?
Hibernate:
select
tipoprodut0_.id as id2_0_,
tipoprodut0_.descricao as descricao2_0_
from
public.tipo_produto tipoprodut0_
where
tipoprodut0_.id=?
...
Hibernate:
select
produto0_.id as id1_,
produto0_.descricao as descricao1_,
produto0_.fabricante_id as fabricante5_1_,
produto0_.nome as nome1_,
produto0_.tipo_id as tipo6_1_,
produto0_.valor as valor1_
from
public.produto produto0_
Para cada item do resultado acima faz:
Hibernate:
select
fabricante0_.id as id0_0_,
fabricante0_.nome as nome0_0_
from
public.fabricante fabricante0_
where
fabricante0_.id=?
Hibernate:
select
tipoprodut0_.id as id2_0_,
tipoprodut0_.descricao as descricao2_0_
from
public.tipo_produto tipoprodut0_
where
tipoprodut0_.id=?
...
68/97
Batch Update – 1º Exemplo
Executa para cada item do resultado da lista.
Hibernate:
update
public.produto
set
valor=?
where
Id=?
...
Executa para cada item do resultado da lista.
Hibernate:
update
public.produto
set
valor=?
where
Id=?
...
69/97
Batch Update – 2º Exemplo
70/97
Batch Update – 2º Exemplo
update
public.produto
set
valor=valor*?
update
public.produto
set
valor=valor*?
71/97
Batch ...
● Batch Insert
● Batch Delete
72/97
Binários
73/97
Binários
74/97
Binários
75/97
Binários select
processo0_.id as id6_0_,
processo0_.dataDistribuicao as dataDist2_6_0_,
processo0_.numero as numero6_0_
from
public.Processo processo0_
where
processo0_.id=?
select
processo0_.id as id6_0_,
processo0_.dataDistribuicao as dataDist2_6_0_,
processo0_.numero as numero6_0_
from
public.Processo processo0_
where
processo0_.id=?
76/97
Binários select
movimentos0_.processo_id as processo5_6_1_,
movimentos0_.id as id1_,
movimentos0_.id as id8_0_,
movimentos0_.data as data8_0_,
movimentos0_.descricao as descricao8_0_,
movimentos0_.numero as numero8_0_,
movimentos0_.processo_id as processo5_8_0_
from
public.Movimento movimentos0_
where
movimentos0_.processo_id=?
select
movimentos0_.processo_id as processo5_6_1_,
movimentos0_.id as id1_,
movimentos0_.id as id8_0_,
movimentos0_.data as data8_0_,
movimentos0_.descricao as descricao8_0_,
movimentos0_.numero as numero8_0_,
movimentos0_.processo_id as processo5_8_0_
from
public.Movimento movimentos0_
where
movimentos0_.processo_id=?
77/97
Binários A cada iteração do FOR do movimento faz:
select
arquivos0_.movimento_id as movimento7_8_1_,
arquivos0_.id as id1_,
arquivos0_.id as id7_0_,
arquivos0_.conteudo as conteudo7_0_,
arquivos0_.conteudo_tipo as conteudo3_7_0_,
arquivos0_.data_verificacao_assinatura as data4_7_0_,
arquivos0_.movimento_id as movimento7_7_0_,
arquivos0_.nome as nome7_0_,
arquivos0_.signatario as signatario7_0_
from
public.Arquivo arquivos0_
where
arquivos0_.movimento_id=?
A cada iteração do FOR do movimento faz:
select
arquivos0_.movimento_id as movimento7_8_1_,
arquivos0_.id as id1_,
arquivos0_.id as id7_0_,
arquivos0_.conteudo as conteudo7_0_,
arquivos0_.conteudo_tipo as conteudo3_7_0_,
arquivos0_.data_verificacao_assinatura as data4_7_0_,
arquivos0_.movimento_id as movimento7_7_0_,
arquivos0_.nome as nome7_0_,
arquivos0_.signatario as signatario7_0_
from
public.Arquivo arquivos0_
where
arquivos0_.movimento_id=?
78/97
Binários
Somente quando o usuário clicar
neste link que vamos mostrar o conteúdo
do arquivo.
????
Somente quando o usuário clicar
neste link que vamos mostrar o conteúdo
do arquivo.
????
79/97
Binários
80/97
Binários
81/97
Binários
82/97
Binários
83/97
Binários select
processo0_.id as id6_0_,
processo0_.dataDistribuicao as dataDist2_6_0_,
processo0_.numero as numero6_0_
from
public.Processo processo0_
where
processo0_.id=?
select
processo0_.id as id6_0_,
processo0_.dataDistribuicao as dataDist2_6_0_,
processo0_.numero as numero6_0_
from
public.Processo processo0_
where
processo0_.id=?
84/97
Binários select
movimentos0_.processo_id as processo5_6_1_,
movimentos0_.id as id1_,
movimentos0_.id as id8_0_,
movimentos0_.data as data8_0_,
movimentos0_.descricao as descricao8_0_,
movimentos0_.numero as numero8_0_,
movimentos0_.processo_id as processo5_8_0_
from
public.Movimento movimentos0_
where
movimentos0_.processo_id=?
select
movimentos0_.processo_id as processo5_6_1_,
movimentos0_.id as id1_,
movimentos0_.id as id8_0_,
movimentos0_.data as data8_0_,
movimentos0_.descricao as descricao8_0_,
movimentos0_.numero as numero8_0_,
movimentos0_.processo_id as processo5_8_0_
from
public.Movimento movimentos0_
where
movimentos0_.processo_id=?
85/97
Binários A cada iteração do FOR do movimento faz:
select
arquivos0_.movimento_id as movimento7_11_1_,
arquivos0_.id as id1_,
arquivos0_.id as id7_0_,
arquivos0_.conteudo_id as conteudo6_7_0_,
arquivos0_.conteudo_tipo as conteudo2_7_0_,
arquivos0_.data_verificacao_assinatura as data3_7_0_,
arquivos0_.movimento_id as movimento7_7_0_,
arquivos0_.nome as nome7_0_,
arquivos0_.signatario as signatario7_0_
from
public.arquiv0 arquivos0_
where
arquivos0_.movimento_id=?
A cada iteração do FOR do movimento faz:
select
arquivos0_.movimento_id as movimento7_11_1_,
arquivos0_.id as id1_,
arquivos0_.id as id7_0_,
arquivos0_.conteudo_id as conteudo6_7_0_,
arquivos0_.conteudo_tipo as conteudo2_7_0_,
arquivos0_.data_verificacao_assinatura as data3_7_0_,
arquivos0_.movimento_id as movimento7_7_0_,
arquivos0_.nome as nome7_0_,
arquivos0_.signatario as signatario7_0_
from
public.arquiv0 arquivos0_
where
arquivos0_.movimento_id=?
86/97
Query com FETCH
87/97
Query com FETCH select
process0x0_.id as id4_0_,
movimentos1_.id as id9_1_,
process0x0_.dataDistribuicao as dataDist2_4_0_,
process0x0_.numero as numero4_0_,
movimentos1_.data as data9_1_,
movimentos1_.descricao as descricao9_1_,
movimentos1_.numero as numero9_1_,
movimentos1_.processo_id as processo5_9_1_,
movimentos1_.processo_id as processo5_4_0__,
movimentos1_.id as id0__
from
public.process0 process0x0_
left outer join
public.moviment0 movimentos1_
on process0x0_.id=movimentos1_.processo_id
where
process0x0_.id=?
select
process0x0_.id as id4_0_,
movimentos1_.id as id9_1_,
process0x0_.dataDistribuicao as dataDist2_4_0_,
process0x0_.numero as numero4_0_,
movimentos1_.data as data9_1_,
movimentos1_.descricao as descricao9_1_,
movimentos1_.numero as numero9_1_,
movimentos1_.processo_id as processo5_9_1_,
movimentos1_.processo_id as processo5_4_0__,
movimentos1_.id as id0__
from
public.process0 process0x0_
left outer join
public.moviment0 movimentos1_
on process0x0_.id=movimentos1_.processo_id
where
process0x0_.id=?
88/97
Query com FETCH
Agora não faz nada, já carregou os
movimentos na consulta anterior.
Agora não faz nada, já carregou os
movimentos na consulta anterior.
89/97
Query com FETCH
A cada iteração do FOR do movimento faz:
select
arquivos0_.movimento_id as movimento7_11_1_,
arquivos0_.id as id1_,
arquivos0_.id as id7_0_,
arquivos0_.conteudo_id as conteudo6_7_0_,
arquivos0_.conteudo_tipo as conteudo2_7_0_,
arquivos0_.data_verificacao_assinatura as data3_7_0_,
arquivos0_.movimento_id as movimento7_7_0_,
arquivos0_.nome as nome7_0_,
arquivos0_.signatario as signatario7_0_
from
public.arquiv0 arquivos0_
where
arquivos0_.movimento_id=?
A cada iteração do FOR do movimento faz:
select
arquivos0_.movimento_id as movimento7_11_1_,
arquivos0_.id as id1_,
arquivos0_.id as id7_0_,
arquivos0_.conteudo_id as conteudo6_7_0_,
arquivos0_.conteudo_tipo as conteudo2_7_0_,
arquivos0_.data_verificacao_assinatura as data3_7_0_,
arquivos0_.movimento_id as movimento7_7_0_,
arquivos0_.nome as nome7_0_,
arquivos0_.signatario as signatario7_0_
from
public.arquiv0 arquivos0_
where
arquivos0_.movimento_id=?
90/97
BatchSize
91/97
BatchSize
92/97
BatchSize
93/97
BatchSize select
process0x0_.id as id4_0_,
movimentos1_.id as id9_1_,
process0x0_.dataDistribuicao as dataDist2_4_0_,
process0x0_.numero as numero4_0_,
movimentos1_.data as data9_1_,
movimentos1_.descricao as descricao9_1_,
movimentos1_.numero as numero9_1_,
movimentos1_.processo_id as processo5_9_1_,
movimentos1_.processo_id as processo5_4_0__,
movimentos1_.id as id0__
from
public.process0 process0x0_
left outer join
public.moviment0 movimentos1_
on process0x0_.id=movimentos1_.processo_id
where
process0x0_.id=?
select
process0x0_.id as id4_0_,
movimentos1_.id as id9_1_,
process0x0_.dataDistribuicao as dataDist2_4_0_,
process0x0_.numero as numero4_0_,
movimentos1_.data as data9_1_,
movimentos1_.descricao as descricao9_1_,
movimentos1_.numero as numero9_1_,
movimentos1_.processo_id as processo5_9_1_,
movimentos1_.processo_id as processo5_4_0__,
movimentos1_.id as id0__
from
public.process0 process0x0_
left outer join
public.moviment0 movimentos1_
on process0x0_.id=movimentos1_.processo_id
where
process0x0_.id=?
94/97
BatchSize
Agora não faz nada, já carregou os
movimentos na consulta anterior.
Agora não faz nada, já carregou os
movimentos na consulta anterior.
95/97
BatchSize
select
arquivos0_.movimento_id as movimento7_11_1_,
arquivos0_.id as id1_,
arquivos0_.id as id7_0_,
arquivos0_.conteudo_id as conteudo6_7_0_,
arquivos0_.conteudo_tipo as conteudo2_7_0_,
arquivos0_.data_verificacao_assinatura as data3_7_0_,
arquivos0_.movimento_id as movimento7_7_0_,
arquivos0_.nome as nome7_0_,
arquivos0_.signatario as signatario7_0_
from
public.arquiv0 arquivos0_
where
arquivos0_.movimento_id in (
?, ?, ?, ?, ?
)
select
arquivos0_.movimento_id as movimento7_11_1_,
arquivos0_.id as id1_,
arquivos0_.id as id7_0_,
arquivos0_.conteudo_id as conteudo6_7_0_,
arquivos0_.conteudo_tipo as conteudo2_7_0_,
arquivos0_.data_verificacao_assinatura as data3_7_0_,
arquivos0_.movimento_id as movimento7_7_0_,
arquivos0_.nome as nome7_0_,
arquivos0_.signatario as signatario7_0_
from
public.arquiv0 arquivos0_
where
arquivos0_.movimento_id in (
?, ?, ?, ?, ?
)
96/97
Utilizar
● A vontade
● Hibernate Statistics
● Paginação
● query.setFirstResult() - Offset
● query.setMaxResults() - Limit
● Pool de conexões
● Aplication server – Ex: JBOSS AS
● C3P0
● Com cautela
● Sql nativo - Procedures
● Desnormalização
97/97
Obrigado
:)

Mais conteúdo relacionado

Destaque (17)

Rolling Stones
Rolling StonesRolling Stones
Rolling Stones
 
Cca academy 1.0 july 2013
Cca academy 1.0 july 2013Cca academy 1.0 july 2013
Cca academy 1.0 july 2013
 
Teoría científica y tiempos modernos viviana
Teoría científica y tiempos modernos vivianaTeoría científica y tiempos modernos viviana
Teoría científica y tiempos modernos viviana
 
Biolina
BiolinaBiolina
Biolina
 
Circular 12
Circular 12Circular 12
Circular 12
 
Essex Presentation
Essex PresentationEssex Presentation
Essex Presentation
 
Moeder worden is een revolutie
Moeder worden is een revolutieMoeder worden is een revolutie
Moeder worden is een revolutie
 
DAV4
DAV4DAV4
DAV4
 
In minder blijde verwachting
In minder blijde verwachtingIn minder blijde verwachting
In minder blijde verwachting
 
Colirio para seus olhos
Colirio para seus olhosColirio para seus olhos
Colirio para seus olhos
 
Ee 2484i
Ee 2484iEe 2484i
Ee 2484i
 
Violencia intrafamiliar presentacion
Violencia intrafamiliar presentacionViolencia intrafamiliar presentacion
Violencia intrafamiliar presentacion
 
Estrategias acciones conexiones_be
Estrategias acciones conexiones_beEstrategias acciones conexiones_be
Estrategias acciones conexiones_be
 
Copy_of_Compensation_Plan_India
Copy_of_Compensation_Plan_IndiaCopy_of_Compensation_Plan_India
Copy_of_Compensation_Plan_India
 
Doc1
Doc1Doc1
Doc1
 
CUNY Academic Commons Tour
CUNY Academic Commons TourCUNY Academic Commons Tour
CUNY Academic Commons Tour
 
Ee 0194e
Ee 0194eEe 0194e
Ee 0194e
 

Semelhante a Otimizando ORM com Hibernate

DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...Fabrízio Mello
 
Alta Disponibilidade TechEd
Alta Disponibilidade TechEdAlta Disponibilidade TechEd
Alta Disponibilidade TechEdViviane_ribeiro
 
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...Taller Negócio Digitais
 
Mapeamento brb 2013 em videoaulas do provas de ti google drive
Mapeamento brb 2013 em videoaulas do provas de ti   google driveMapeamento brb 2013 em videoaulas do provas de ti   google drive
Mapeamento brb 2013 em videoaulas do provas de ti google driveffabii
 
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério NizzolaTdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério NizzolaDextra Sistemas / Etec Itu
 
[DTC21] André Marques - Jornada do Engenheiro de Dados
[DTC21] André Marques - Jornada do Engenheiro de Dados[DTC21] André Marques - Jornada do Engenheiro de Dados
[DTC21] André Marques - Jornada do Engenheiro de DadosDeep Tech Brasil
 
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
 
Serviços Escaláveis e de Alta Performance com MySQL e Java
Serviços Escaláveis e de Alta Performance com MySQL e JavaServiços Escaláveis e de Alta Performance com MySQL e Java
Serviços Escaláveis e de Alta Performance com MySQL e JavaMySQL Brasil
 
MySQL Cluster - visão geral
MySQL Cluster - visão geralMySQL Cluster - visão geral
MySQL Cluster - visão geralMySQL Brasil
 
Pangea - Plataforma digital com Google Cloud Platform
Pangea - Plataforma digital com Google Cloud PlatformPangea - Plataforma digital com Google Cloud Platform
Pangea - Plataforma digital com Google Cloud PlatformAndré Paulovich
 
Refactoring Databases
Refactoring DatabasesRefactoring Databases
Refactoring DatabasesIsmael
 
MySQL Cluster - visão geral
MySQL Cluster - visão geralMySQL Cluster - visão geral
MySQL Cluster - visão geralMySQL Brasil
 
Oracle para Desenvolvedores - recursos e técnicas - visões gerais (Uninove 2016)
Oracle para Desenvolvedores - recursos e técnicas - visões gerais (Uninove 2016)Oracle para Desenvolvedores - recursos e técnicas - visões gerais (Uninove 2016)
Oracle para Desenvolvedores - recursos e técnicas - visões gerais (Uninove 2016)Andre Santos
 
Bancos de Dados em “Clouds”
Bancos de Dados em “Clouds”Bancos de Dados em “Clouds”
Bancos de Dados em “Clouds”elliando dias
 
Programação em Banco de Dados - Aula 16/08/2018
Programação em Banco de Dados - Aula 16/08/2018Programação em Banco de Dados - Aula 16/08/2018
Programação em Banco de Dados - Aula 16/08/2018Elaine Cecília Gatto
 

Semelhante a Otimizando ORM com Hibernate (20)

DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
DBA Brasil 2.0: Como o papel e atividades de DBA ficam no contexto da cultura...
 
Alta Disponibilidade TechEd
Alta Disponibilidade TechEdAlta Disponibilidade TechEd
Alta Disponibilidade TechEd
 
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...
Os pecados mortais de escalabilidade em Drupal e seus efeitos nos negócios - ...
 
Mapeamento brb 2013 em videoaulas do provas de ti google drive
Mapeamento brb 2013 em videoaulas do provas de ti   google driveMapeamento brb 2013 em videoaulas do provas de ti   google drive
Mapeamento brb 2013 em videoaulas do provas de ti google drive
 
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério NizzolaTdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
 
[DTC21] André Marques - Jornada do Engenheiro de Dados
[DTC21] André Marques - Jornada do Engenheiro de Dados[DTC21] André Marques - Jornada do Engenheiro de Dados
[DTC21] André Marques - Jornada do Engenheiro de Dados
 
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
 
Serviços Escaláveis e de Alta Performance com MySQL e Java
Serviços Escaláveis e de Alta Performance com MySQL e JavaServiços Escaláveis e de Alta Performance com MySQL e Java
Serviços Escaláveis e de Alta Performance com MySQL e Java
 
MySQL Cluster - visão geral
MySQL Cluster - visão geralMySQL Cluster - visão geral
MySQL Cluster - visão geral
 
Pangea - Plataforma digital com Google Cloud Platform
Pangea - Plataforma digital com Google Cloud PlatformPangea - Plataforma digital com Google Cloud Platform
Pangea - Plataforma digital com Google Cloud Platform
 
RAD
RADRAD
RAD
 
Refactoring Databases
Refactoring DatabasesRefactoring Databases
Refactoring Databases
 
Sql01 final
Sql01 finalSql01 final
Sql01 final
 
MySQL Cluster - visão geral
MySQL Cluster - visão geralMySQL Cluster - visão geral
MySQL Cluster - visão geral
 
Oracle para Desenvolvedores - recursos e técnicas - visões gerais (Uninove 2016)
Oracle para Desenvolvedores - recursos e técnicas - visões gerais (Uninove 2016)Oracle para Desenvolvedores - recursos e técnicas - visões gerais (Uninove 2016)
Oracle para Desenvolvedores - recursos e técnicas - visões gerais (Uninove 2016)
 
Bancos de Dados em “Clouds”
Bancos de Dados em “Clouds”Bancos de Dados em “Clouds”
Bancos de Dados em “Clouds”
 
B Ds Clouds
B Ds CloudsB Ds Clouds
B Ds Clouds
 
Framework JGenesis
Framework JGenesisFramework JGenesis
Framework JGenesis
 
Magento: Mitos vs Vantagens
Magento: Mitos vs VantagensMagento: Mitos vs Vantagens
Magento: Mitos vs Vantagens
 
Programação em Banco de Dados - Aula 16/08/2018
Programação em Banco de Dados - Aula 16/08/2018Programação em Banco de Dados - Aula 16/08/2018
Programação em Banco de Dados - Aula 16/08/2018
 

Otimizando ORM com Hibernate

  • 1. 1/97 PGBR2013 Desenvolvendo Otimizado com PostgreSQL e Programação Orientada a Objetos Pablo Filetti Moreira pablo.filetti@gmail.com
  • 2. 2/97 Agenda ● Baixa performance... ● ORM – Mapeamento Objeto/Relacional ● JPA – Java Persistence API ● Hibernate ● Fetching – Eager ● Fetching – Lazy ● Collection Fetching – Lazy ● Collection Fetching – Eager ● Cache do 1º Nível ● Cache do 2º Nível ● DynamicUpdate ● Query com NEW ● Batch Update ● Batch … ● Binários ● Query com FETCH ● BatchSize
  • 3. 3/97 Baixa performance... Para Fernando Ike de Oliveira 60% Problemas são relacionados ao mau uso de expressões SQL. 20% Problemas são relacionados a má modelagem do BD's. 10% Problemas são relacionados a má configuração do SGDB. 10% Problemas são relacionados a má configuração do SO. (OLIVEIRA,http://www.midstorm.org/~fike/palestras/tuning_pg_consegi.pdf)
  • 4. 4/97 Baixa performance... Para Fábio Telles Rodriguez Por mais que os desenvolvedores reclamem do servidor de banco de dados, em 80% dos casos o problema está na aplicação e em 20% no SGDB. Não que a aplicação seja ruim em si, mas ela pode não usar o SGDB de forma eficiente. Existem várias formas de se obter os mesmos dados de forma ineficiente. Pior, uma consulta que funcionava bem num SGDB pode ter uma performance catastrófica em outro SGDB. Infelizmente isto pode ocorrer também com migrações para outra versão do mesmo SGDB. Mesmo assim, a culpa ainda não é do SGDB. A aplicação que tem (infelizmente) de adaptar às especificidades de cada fornecedor e cada versão. Na verdade, se formos levar a questão de forma mais ponderada, a lei não seria 80/20, seria 99,9/0,01 . Isto ocorre por um motivo simples, ajustes de SQL e modelagem podem resultar em ganhos de performance da ordem de 10, 100 ou até 1000 vezes. Enquanto isso, ajustes no SO e SGDB tem ganhos da ordem de até 10 vezes. Portanto, antes de mais nada aprenda a modelar bem e conheça as minúcias do SQL do seu SGDB. Depois aprenda a analisar com profundidade os planos de execução e reescreva consultas complexas a partir deste tipo de análise. (RODRIGUES, http://www.midstorm.org/~telles/2008/03/04/12-dicas-para-aprender-a-ajustar-a- performance-de-bancos-de-dados/)
  • 5. 5/97 Baixa performance... Para Kenia Milene 65% das causas de baixa performance em Bancos de Dados são causadas pelas aplicações. Dificilmente temos no mesmo ambiente um DBA Desenvolvedor ou um Desenvolvedor DBA, sendo assim, muito , mas muito cuidado na criação das consultas. 25% são causados pelos modelos de dados. Banco mal modelado tende a ser terrível. A melhor forma é normalizar o modelo, com isso ganhamos economia de espaço e a não repetição dos dados. Porém é necessário uma análise, pois em relatórios muito grandes não é aconselhável normalização quando falamos de ganho de performance. 5% são problemas do SGDB, acontece do gerenciador do banco não ter um algoritmo eficiente, ou não consegue manter as informações necessárias na memória por tempo eficiente. Atenção na aplicação de patchs e upgrades de versões. 5% são causadas por configurações ou deficiências do Sistema Operacional. Atenção no fluxo da rede, muitas vezes o servidor esta com uma placa de rede não adequada para a quantidade de fluxo de informações que trafega. Verificações de parâmetros de Kernel também são consideráveis, pois o S.O pode não estar deixando o banco escalonar que influencia no impacto do sistema. (MILENE, http://keniamilene.wordpress.com/2007/10/25/regras-basicas-de-tuning-de-banco-de-dados/).
  • 6. 6/97 Baixa performance... Para Claudia Machado ●Sistema operacional, caso tenha sido mal parametrizado; ●SGBD Relacional, por causa de inadequadas configurações relacionadas às áreas de buffers, organização do logging, alocação de arquivos, entre outros; ●Rede, no caso de impactos no tráfego em razão de processamento de dados efetuados no servidor ou na rede; ●Modelo físico de dados, em razão de inadequação na definição da estrutura das tabelas e índices; ●Aplicação, quando ocorrem problemas na estrutura lógica efetuada pelo programador, o que compreende a linguagem hospedeira e os comandos em SQL. (MACHADO,http://linhaseletrasweb.blogspot.com/2010/03/tuning-de-bancos-de- dados.html)
  • 7. 7/97 A culpa é de quem??? Desenvolvedores “Este Banco é uma carroça” DBAs “Esta aplicação é cheia de gambiarras”
  • 8. 8/97 ORM – Mapeamento Objeto/Relacional Por muitos anos, persistência tem sido um tópico quente de debates na comunidade Java. Muitos desenvolvedores nem mesmo concordam com o escopo do problema. Será a persistência um problema que já foi resolvido pela tecnologia relacional e suas extensões como procedimentos armazenados (stored procedures), ou ele é um problema mais amplo que precisa ser endereçado por modelos de componentes Java especiais, como os entity beans (componentes de entidade) do EJB? Devemos escrever à mão até mesmo as mais primitivas operações CRUD (criar, ler, atualizar, deletar – create, read, update, delete) em SQL e JDBC, ou esse trabalho deve ser automatizado? Como alcançamos portabilidade se todo sistema de gerenciamento de banco de dados possui o seu próprio dialeto SQL? Devemos abandonar o SQL em definitivo e adotar uma tecnologia diferente de banco de dados, como o sistema de banco de dados orientado para objetos? O debate continua, mas agora a solução chamada mapeamento objeto/relacional (ORM – object/relational mapping) tem uma grande aceitação. (BAUER e KING, 2007, p.4)
  • 9. 9/97 JPA – Java Persistence API ● Especificação ● Providers ● Hibernate ● EclipseLink ● OpenJPA ● TopLink
  • 10. 10/97 Hibernate O Hibernate é um projeto ambicioso que visa ser uma solução completa para o problema de gerenciar dados persistentes em Java. Ele medeia a interação da aplicação com o banco de dados relacional, deixando o desenvolvedor livre para se concentrar no problema de negócio que tem nas mãos. O Hibernate é uma solução não intrusiva. Não é necessário que você siga muitas das regras e dos padrões de projeto específicos do Hibernate quanto estiver escrevendo a sua lógica de negócio e suas classes persistentes; é por essa razão que o Hibernate se integra tranquilamente à maioria das novas e existentes aplicações e não necessita de mudanças incômodas ao resto da aplicação. (BAUER e KING, 2007, p.4)
  • 11. 11/97 Hibernate ● Produtivade ● Multibanco ● Sem SQL ● Criteria + JPQL (HQL) ● Cache ● Envers – Auditoria ● Hibernate Statistics
  • 14. 14/97 Fetching – Eager select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=? select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=?
  • 17. 17/97 Fetching – Lazy select produtofet0_.id as id1_0_, produtofet0_.descricao as descricao1_0_, produtofet0_.fabricante_id as fabricante5_1_0_, produtofet0_.nome as nome1_0_, produtofet0_.tipo_id as tipo6_1_0_, produtofet0_.valor as valor1_0_ from public.produto produtofet0_ where produtofet0_.id=? select produtofet0_.id as id1_0_, produtofet0_.descricao as descricao1_0_, produtofet0_.fabricante_id as fabricante5_1_0_, produtofet0_.nome as nome1_0_, produtofet0_.tipo_id as tipo6_1_0_, produtofet0_.valor as valor1_0_ from public.produto produtofet0_ where produtofet0_.id=?
  • 18. 18/97 Fetching – Lazy select fabricante0_.id as id0_0_, fabricante0_.nome as nome0_0_ from public.fabricante fabricante0_ where fabricante0_.id=? select fabricante0_.id as id0_0_, fabricante0_.nome as nome0_0_ from public.fabricante fabricante0_ where fabricante0_.id=?
  • 19. 19/97 Fetching – Lazy select tipoprodut0_.id as id2_0_, tipoprodut0_.descricao as descricao2_0_ from public.tipo_produto tipoprodut0_ where tipoprodut0_.id=? select tipoprodut0_.id as id2_0_, tipoprodut0_.descricao as descricao2_0_ from public.tipo_produto tipoprodut0_ where tipoprodut0_.id=?
  • 20. 20/97 Collection Fetching – Classe Fabricante
  • 21. 21/97 Collection Fetching – Lazy select fabricante0_.id as id0_0_, fabricante0_.nome as nome0_0_ from public.fabricante fabricante0_ where fabricante0_.id=? select fabricante0_.id as id0_0_, fabricante0_.nome as nome0_0_ from public.fabricante fabricante0_ where fabricante0_.id=?
  • 22. 22/97 Collection Fetching – Lazy select produtos0_.fabricante_id as fabricante5_0_2_, produtos0_.id as id2_, produtos0_.id as id1_1_, produtos0_.descricao as descricao1_1_, produtos0_.fabricante_id as fabricante5_1_1_, produtos0_.nome as nome1_1_, produtos0_.tipo_id as tipo6_1_1_, produtos0_.valor as valor1_1_, tipoprodut1_.id as id2_0_, tipoprodut1_.descricao as descricao2_0_ from public.produto produtos0_ inner join public.tipo_produto tipoprodut1_ on produtos0_.tipo_id=tipoprodut1_.id where produtos0_.fabricante_id=? select produtos0_.fabricante_id as fabricante5_0_2_, produtos0_.id as id2_, produtos0_.id as id1_1_, produtos0_.descricao as descricao1_1_, produtos0_.fabricante_id as fabricante5_1_1_, produtos0_.nome as nome1_1_, produtos0_.tipo_id as tipo6_1_1_, produtos0_.valor as valor1_1_, tipoprodut1_.id as id2_0_, tipoprodut1_.descricao as descricao2_0_ from public.produto produtos0_ inner join public.tipo_produto tipoprodut1_ on produtos0_.tipo_id=tipoprodut1_.id where produtos0_.fabricante_id=?
  • 23. 23/97 Collection Fetching – Mapeamento Eager
  • 25. 25/97 Collection Fetching – Eager Hibernate: select fabricante0_.id as id0_2_, fabricante0_.nome as nome0_2_, produtos1_.fabricante_id as fabricante5_0_4_, produtos1_.id as id4_, produtos1_.id as id1_0_, produtos1_.descricao as descricao1_0_, produtos1_.fabricante_id as fabricante5_1_0_, produtos1_.nome as nome1_0_, produtos1_.tipo_id as tipo6_1_0_, produtos1_.valor as valor1_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.fabricante fabricante0_ left outer join public.produto produtos1_ on fabricante0_.id=produtos1_.fabricante_id left outer join public.tipo_produto tipoprodut2_ on produtos1_.tipo_id=tipoprodut2_.id where fabricante0_.id=? Hibernate: select fabricante0_.id as id0_2_, fabricante0_.nome as nome0_2_, produtos1_.fabricante_id as fabricante5_0_4_, produtos1_.id as id4_, produtos1_.id as id1_0_, produtos1_.descricao as descricao1_0_, produtos1_.fabricante_id as fabricante5_1_0_, produtos1_.nome as nome1_0_, produtos1_.tipo_id as tipo6_1_0_, produtos1_.valor as valor1_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.fabricante fabricante0_ left outer join public.produto produtos1_ on fabricante0_.id=produtos1_.fabricante_id left outer join public.tipo_produto tipoprodut2_ on produtos1_.tipo_id=tipoprodut2_.id where fabricante0_.id=?
  • 26. 26/97 Cache de 1º Nível – 1º Exemplo
  • 27. 27/97 Cache de 1º Nível – 1º Exemplo select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=? select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=?
  • 28. 28/97 Cache de 1º Nível – 1º Exemplo Não faz consulta no BD. A Entidade esta no Cache de 1º Nível Não faz consulta no BD. A Entidade esta no Cache de 1º Nível
  • 29. 29/97 Cache de 1º Nível – 1º Exemplo HashCode pri. produto: 1262837020HashCode pri. produto: 1262837020
  • 30. 30/97 Cache de 1º Nível – 1º Exemplo HashCode seg. produto: 1262837020HashCode seg. produto: 1262837020
  • 31. 31/97 Cache de 1º Nível – 1º Exemplo Resultado da comparação equals: trueResultado da comparação equals: true
  • 32. 32/97 Cache de 1º Nível – 1º Exemplo Resultado da comparação equals: trueResultado da comparação equals: true
  • 33. 33/97 Cache de 1º Nível – 2º Exemplo
  • 34. 34/97 Cache de 1º Nível – 2º Exemploselect produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=? select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=?
  • 35. 35/97 Cache de 1º Nível – 2º Exemplo select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=? select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=?
  • 36. 36/97 Cache de 1º Nível – 2º Exemplo HashCode pri. usuário: 1520159108HashCode pri. usuário: 1520159108
  • 37. 37/97 Cache de 1º Nível – 2º Exemplo HashCode seg. usuário: 1147380142HashCode seg. usuário: 1147380142
  • 38. 38/97 Cache de 1º Nível – 2º Exemplo Resultado da comparação equals: falseResultado da comparação equals: false
  • 39. 39/97 Cache de 2º Nível Providers ● EhCache ● OSCache ● Terracotta ● Infinispan
  • 40. 40/97 Cache de 2º Nível – Persistence.xml
  • 41. 41/97 Cache de 2º Nível – Mapeamento Cache
  • 42. 42/97 Cache de 2º Nível – Estratégias ● READ_ONLY - Esta é a estratégia mais restritiva, indicada para entidades que são apenas lidas e nunca modificadas pela aplicação. ● READ_WRITE - A estratégia leitura e escrita é a mais abrangente e suporta escrita mais frequente, garantido que a última versão do cache é a mesma do banco. ● NONSTRICT_READ_WRITE - Indicada para objetos que são raramente atualizados e que têm probabilidade de atualizações simultâneas muito baixas e é a mais comum. Caso muitas atualizações ocorram "simultaneamente" pode ser que a última versão comitada no banco não seja a mesma que acabou ficando no seu cache. ● TRANSACTIONAL - É totalmente transacional, com suporte a caches distribuídos. Poucos providers oferecem esse suporte. O provider EhCache não tem suporte a esta estratégia.
  • 43. 43/97 Cache de 2º Nível – 1º Exemplo
  • 44. 44/97 Cache de 2º Nível – 1º Exemplo select tipoprodut0_.id as id2_0_, tipoprodut0_.descricao as descricao2_0_ from public.tipo_produto tipoprodut0_ where tipoprodut0_.id=? select tipoprodut0_.id as id2_0_, tipoprodut0_.descricao as descricao2_0_ from public.tipo_produto tipoprodut0_ where tipoprodut0_.id=?
  • 45. 45/97 Cache de 2º Nível – 1º Exemplo Não faz consulta no BD. A Entidade esta no Cache de 2º Nível Não faz consulta no BD. A Entidade esta no Cache de 2º Nível
  • 46. 46/97 Cache de 2º Nível – 1º Exemplo HashCode pri. tipo de produto: 480476266HashCode pri. tipo de produto: 480476266
  • 47. 47/97 Cache de 2º Nível – 1º Exemplo HashCode seg. tipo de produto: 1142116702HashCode seg. tipo de produto: 1142116702
  • 48. 48/97 Cache de 2º Nível – 1º Exemplo Resultado da comparação equals: falseResultado da comparação equals: false
  • 49. 49/97 Cache de 2º Nível – 2º Exemplo
  • 50. 50/97 Cache de 2º Nível – 2º Exemplo select tipoprodut0_.id as id2_, tipoprodut0_.descricao as descricao2_ from public.tipo_produto tipoprodut0_ select tipoprodut0_.id as id2_, tipoprodut0_.descricao as descricao2_ from public.tipo_produto tipoprodut0_
  • 51. 51/97 Cache de 2º Nível – 2º Exemplo Não faz consulta no BD. A Entidade esta no Cache de 2º Nível Não faz consulta no BD. A Entidade esta no Cache de 2º Nível
  • 52. 52/97 Cache de 2º Nível – 2º Exemplo Não faz consulta no BD. A Entidade esta no Cache de 2º Nível Não faz consulta no BD. A Entidade esta no Cache de 2º Nível
  • 54. 54/97 DynamicUpdate – 1º Exemplo select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=? select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=?
  • 55. 55/97 DynamicUpdate – 1º Exemplo update public.produto set descricao=?, fabricante_id=?, nome=?, tipo_id=?, valor=? where id=? update public.produto set descricao=?, fabricante_id=?, nome=?, tipo_id=?, valor=? where id=?
  • 58. 58/97 DynamicUpdate – 2º Exemplo select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=? select produto0_.id as id1_2_, produto0_.descricao as descricao1_2_, produto0_.fabricante_id as fabricante5_1_2_, produto0_.nome as nome1_2_, produto0_.tipo_id as tipo6_1_2_, produto0_.valor as valor1_2_, fabricante1_.id as id0_0_, fabricante1_.nome as nome0_0_, tipoprodut2_.id as id2_1_, tipoprodut2_.descricao as descricao2_1_ from public.produto produto0_ inner join public.fabricante fabricante1_ on produto0_.fabricante_id=fabricante1_.id inner join public.tipo_produto tipoprodut2_ on produto0_.tipo_id=tipoprodut2_.id where produto0_.id=?
  • 59. 59/97 DynamicUpdate – 2º Exemplo update public.produto set nome=? where id=? update public.produto set nome=? where id=?
  • 60. 60/97 Query com NEW – 1º Exemplo
  • 61. 61/97 Query com NEW – 1º Exemplo
  • 62. 62/97 Query com NEW – 1º Exemplo select produto0_.id as id1_, produto0_.descricao as descricao1_, produto0_.fabricante_id as fabricante5_1_, produto0_.nome as nome1_, produto0_.tipo_id as tipo6_1_, produto0_.valor as valor1_ from public.produto produto0_ order by produto0_.nome select produto0_.id as id1_, produto0_.descricao as descricao1_, produto0_.fabricante_id as fabricante5_1_, produto0_.nome as nome1_, produto0_.tipo_id as tipo6_1_, produto0_.valor as valor1_ from public.produto produto0_ order by produto0_.nome
  • 63. 63/97 Query com NEW – 2º Exemplo
  • 64. 64/97 Query com NEW – 2º Exemplo
  • 65. 65/97 Query com NEW – 2º Exemplo select produto0_.id as col_0_0_, produto0_.nome as col_1_0_ from public.produto produto0_ order by produto0_.nome select produto0_.id as col_0_0_, produto0_.nome as col_1_0_ from public.produto produto0_ order by produto0_.nome
  • 66. 66/97 Batch Update – 1º Exemplo
  • 67. 67/97 Batch Update – 1º Exemplo Hibernate: select produto0_.id as id1_, produto0_.descricao as descricao1_, produto0_.fabricante_id as fabricante5_1_, produto0_.nome as nome1_, produto0_.tipo_id as tipo6_1_, produto0_.valor as valor1_ from public.produto produto0_ Para cada item do resultado acima faz: Hibernate: select fabricante0_.id as id0_0_, fabricante0_.nome as nome0_0_ from public.fabricante fabricante0_ where fabricante0_.id=? Hibernate: select tipoprodut0_.id as id2_0_, tipoprodut0_.descricao as descricao2_0_ from public.tipo_produto tipoprodut0_ where tipoprodut0_.id=? ... Hibernate: select produto0_.id as id1_, produto0_.descricao as descricao1_, produto0_.fabricante_id as fabricante5_1_, produto0_.nome as nome1_, produto0_.tipo_id as tipo6_1_, produto0_.valor as valor1_ from public.produto produto0_ Para cada item do resultado acima faz: Hibernate: select fabricante0_.id as id0_0_, fabricante0_.nome as nome0_0_ from public.fabricante fabricante0_ where fabricante0_.id=? Hibernate: select tipoprodut0_.id as id2_0_, tipoprodut0_.descricao as descricao2_0_ from public.tipo_produto tipoprodut0_ where tipoprodut0_.id=? ...
  • 68. 68/97 Batch Update – 1º Exemplo Executa para cada item do resultado da lista. Hibernate: update public.produto set valor=? where Id=? ... Executa para cada item do resultado da lista. Hibernate: update public.produto set valor=? where Id=? ...
  • 69. 69/97 Batch Update – 2º Exemplo
  • 70. 70/97 Batch Update – 2º Exemplo update public.produto set valor=valor*? update public.produto set valor=valor*?
  • 71. 71/97 Batch ... ● Batch Insert ● Batch Delete
  • 75. 75/97 Binários select processo0_.id as id6_0_, processo0_.dataDistribuicao as dataDist2_6_0_, processo0_.numero as numero6_0_ from public.Processo processo0_ where processo0_.id=? select processo0_.id as id6_0_, processo0_.dataDistribuicao as dataDist2_6_0_, processo0_.numero as numero6_0_ from public.Processo processo0_ where processo0_.id=?
  • 76. 76/97 Binários select movimentos0_.processo_id as processo5_6_1_, movimentos0_.id as id1_, movimentos0_.id as id8_0_, movimentos0_.data as data8_0_, movimentos0_.descricao as descricao8_0_, movimentos0_.numero as numero8_0_, movimentos0_.processo_id as processo5_8_0_ from public.Movimento movimentos0_ where movimentos0_.processo_id=? select movimentos0_.processo_id as processo5_6_1_, movimentos0_.id as id1_, movimentos0_.id as id8_0_, movimentos0_.data as data8_0_, movimentos0_.descricao as descricao8_0_, movimentos0_.numero as numero8_0_, movimentos0_.processo_id as processo5_8_0_ from public.Movimento movimentos0_ where movimentos0_.processo_id=?
  • 77. 77/97 Binários A cada iteração do FOR do movimento faz: select arquivos0_.movimento_id as movimento7_8_1_, arquivos0_.id as id1_, arquivos0_.id as id7_0_, arquivos0_.conteudo as conteudo7_0_, arquivos0_.conteudo_tipo as conteudo3_7_0_, arquivos0_.data_verificacao_assinatura as data4_7_0_, arquivos0_.movimento_id as movimento7_7_0_, arquivos0_.nome as nome7_0_, arquivos0_.signatario as signatario7_0_ from public.Arquivo arquivos0_ where arquivos0_.movimento_id=? A cada iteração do FOR do movimento faz: select arquivos0_.movimento_id as movimento7_8_1_, arquivos0_.id as id1_, arquivos0_.id as id7_0_, arquivos0_.conteudo as conteudo7_0_, arquivos0_.conteudo_tipo as conteudo3_7_0_, arquivos0_.data_verificacao_assinatura as data4_7_0_, arquivos0_.movimento_id as movimento7_7_0_, arquivos0_.nome as nome7_0_, arquivos0_.signatario as signatario7_0_ from public.Arquivo arquivos0_ where arquivos0_.movimento_id=?
  • 78. 78/97 Binários Somente quando o usuário clicar neste link que vamos mostrar o conteúdo do arquivo. ???? Somente quando o usuário clicar neste link que vamos mostrar o conteúdo do arquivo. ????
  • 83. 83/97 Binários select processo0_.id as id6_0_, processo0_.dataDistribuicao as dataDist2_6_0_, processo0_.numero as numero6_0_ from public.Processo processo0_ where processo0_.id=? select processo0_.id as id6_0_, processo0_.dataDistribuicao as dataDist2_6_0_, processo0_.numero as numero6_0_ from public.Processo processo0_ where processo0_.id=?
  • 84. 84/97 Binários select movimentos0_.processo_id as processo5_6_1_, movimentos0_.id as id1_, movimentos0_.id as id8_0_, movimentos0_.data as data8_0_, movimentos0_.descricao as descricao8_0_, movimentos0_.numero as numero8_0_, movimentos0_.processo_id as processo5_8_0_ from public.Movimento movimentos0_ where movimentos0_.processo_id=? select movimentos0_.processo_id as processo5_6_1_, movimentos0_.id as id1_, movimentos0_.id as id8_0_, movimentos0_.data as data8_0_, movimentos0_.descricao as descricao8_0_, movimentos0_.numero as numero8_0_, movimentos0_.processo_id as processo5_8_0_ from public.Movimento movimentos0_ where movimentos0_.processo_id=?
  • 85. 85/97 Binários A cada iteração do FOR do movimento faz: select arquivos0_.movimento_id as movimento7_11_1_, arquivos0_.id as id1_, arquivos0_.id as id7_0_, arquivos0_.conteudo_id as conteudo6_7_0_, arquivos0_.conteudo_tipo as conteudo2_7_0_, arquivos0_.data_verificacao_assinatura as data3_7_0_, arquivos0_.movimento_id as movimento7_7_0_, arquivos0_.nome as nome7_0_, arquivos0_.signatario as signatario7_0_ from public.arquiv0 arquivos0_ where arquivos0_.movimento_id=? A cada iteração do FOR do movimento faz: select arquivos0_.movimento_id as movimento7_11_1_, arquivos0_.id as id1_, arquivos0_.id as id7_0_, arquivos0_.conteudo_id as conteudo6_7_0_, arquivos0_.conteudo_tipo as conteudo2_7_0_, arquivos0_.data_verificacao_assinatura as data3_7_0_, arquivos0_.movimento_id as movimento7_7_0_, arquivos0_.nome as nome7_0_, arquivos0_.signatario as signatario7_0_ from public.arquiv0 arquivos0_ where arquivos0_.movimento_id=?
  • 87. 87/97 Query com FETCH select process0x0_.id as id4_0_, movimentos1_.id as id9_1_, process0x0_.dataDistribuicao as dataDist2_4_0_, process0x0_.numero as numero4_0_, movimentos1_.data as data9_1_, movimentos1_.descricao as descricao9_1_, movimentos1_.numero as numero9_1_, movimentos1_.processo_id as processo5_9_1_, movimentos1_.processo_id as processo5_4_0__, movimentos1_.id as id0__ from public.process0 process0x0_ left outer join public.moviment0 movimentos1_ on process0x0_.id=movimentos1_.processo_id where process0x0_.id=? select process0x0_.id as id4_0_, movimentos1_.id as id9_1_, process0x0_.dataDistribuicao as dataDist2_4_0_, process0x0_.numero as numero4_0_, movimentos1_.data as data9_1_, movimentos1_.descricao as descricao9_1_, movimentos1_.numero as numero9_1_, movimentos1_.processo_id as processo5_9_1_, movimentos1_.processo_id as processo5_4_0__, movimentos1_.id as id0__ from public.process0 process0x0_ left outer join public.moviment0 movimentos1_ on process0x0_.id=movimentos1_.processo_id where process0x0_.id=?
  • 88. 88/97 Query com FETCH Agora não faz nada, já carregou os movimentos na consulta anterior. Agora não faz nada, já carregou os movimentos na consulta anterior.
  • 89. 89/97 Query com FETCH A cada iteração do FOR do movimento faz: select arquivos0_.movimento_id as movimento7_11_1_, arquivos0_.id as id1_, arquivos0_.id as id7_0_, arquivos0_.conteudo_id as conteudo6_7_0_, arquivos0_.conteudo_tipo as conteudo2_7_0_, arquivos0_.data_verificacao_assinatura as data3_7_0_, arquivos0_.movimento_id as movimento7_7_0_, arquivos0_.nome as nome7_0_, arquivos0_.signatario as signatario7_0_ from public.arquiv0 arquivos0_ where arquivos0_.movimento_id=? A cada iteração do FOR do movimento faz: select arquivos0_.movimento_id as movimento7_11_1_, arquivos0_.id as id1_, arquivos0_.id as id7_0_, arquivos0_.conteudo_id as conteudo6_7_0_, arquivos0_.conteudo_tipo as conteudo2_7_0_, arquivos0_.data_verificacao_assinatura as data3_7_0_, arquivos0_.movimento_id as movimento7_7_0_, arquivos0_.nome as nome7_0_, arquivos0_.signatario as signatario7_0_ from public.arquiv0 arquivos0_ where arquivos0_.movimento_id=?
  • 93. 93/97 BatchSize select process0x0_.id as id4_0_, movimentos1_.id as id9_1_, process0x0_.dataDistribuicao as dataDist2_4_0_, process0x0_.numero as numero4_0_, movimentos1_.data as data9_1_, movimentos1_.descricao as descricao9_1_, movimentos1_.numero as numero9_1_, movimentos1_.processo_id as processo5_9_1_, movimentos1_.processo_id as processo5_4_0__, movimentos1_.id as id0__ from public.process0 process0x0_ left outer join public.moviment0 movimentos1_ on process0x0_.id=movimentos1_.processo_id where process0x0_.id=? select process0x0_.id as id4_0_, movimentos1_.id as id9_1_, process0x0_.dataDistribuicao as dataDist2_4_0_, process0x0_.numero as numero4_0_, movimentos1_.data as data9_1_, movimentos1_.descricao as descricao9_1_, movimentos1_.numero as numero9_1_, movimentos1_.processo_id as processo5_9_1_, movimentos1_.processo_id as processo5_4_0__, movimentos1_.id as id0__ from public.process0 process0x0_ left outer join public.moviment0 movimentos1_ on process0x0_.id=movimentos1_.processo_id where process0x0_.id=?
  • 94. 94/97 BatchSize Agora não faz nada, já carregou os movimentos na consulta anterior. Agora não faz nada, já carregou os movimentos na consulta anterior.
  • 95. 95/97 BatchSize select arquivos0_.movimento_id as movimento7_11_1_, arquivos0_.id as id1_, arquivos0_.id as id7_0_, arquivos0_.conteudo_id as conteudo6_7_0_, arquivos0_.conteudo_tipo as conteudo2_7_0_, arquivos0_.data_verificacao_assinatura as data3_7_0_, arquivos0_.movimento_id as movimento7_7_0_, arquivos0_.nome as nome7_0_, arquivos0_.signatario as signatario7_0_ from public.arquiv0 arquivos0_ where arquivos0_.movimento_id in ( ?, ?, ?, ?, ? ) select arquivos0_.movimento_id as movimento7_11_1_, arquivos0_.id as id1_, arquivos0_.id as id7_0_, arquivos0_.conteudo_id as conteudo6_7_0_, arquivos0_.conteudo_tipo as conteudo2_7_0_, arquivos0_.data_verificacao_assinatura as data3_7_0_, arquivos0_.movimento_id as movimento7_7_0_, arquivos0_.nome as nome7_0_, arquivos0_.signatario as signatario7_0_ from public.arquiv0 arquivos0_ where arquivos0_.movimento_id in ( ?, ?, ?, ?, ? )
  • 96. 96/97 Utilizar ● A vontade ● Hibernate Statistics ● Paginação ● query.setFirstResult() - Offset ● query.setMaxResults() - Limit ● Pool de conexões ● Aplication server – Ex: JBOSS AS ● C3P0 ● Com cautela ● Sql nativo - Procedures ● Desnormalização