O documento discute problemas comuns relacionados ao Hibernate e suas soluções, abordando tópicas como: configuração incorreta de pool de conexões, exceção de inicialização preguiçosa e resoluções para lidar com ela, especialmente em aplicações web.
26. mas nem todos dão a devida atenção...
Tuesday, August 7, 2012
27. mas nem todos dão a devida atenção...
até perceberem a app engasgando
Tuesday, August 7, 2012
28. mas nem todos dão a devida atenção...
até perceberem a app engasgando
ou até receberem um
Tuesday, August 7, 2012
29. mas nem todos dão a devida atenção...
até perceberem a app engasgando
ou até receberem um
org.hibernate.exception.Gener
icJDBCException: Cannot
open connection
Tuesday, August 7, 2012
30. daí percebem que não configuraram o
o pool do Hibernate
hibernate.properties
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.url=jdbc:postgresql://localhost:5432/myapp
hibernate.connection.username=postgres
hibernate.connection.password=1234
Tuesday, August 7, 2012
31. daí percebem que não configuraram o
o pool do Hibernate
hibernate.properties
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.url=jdbc:postgresql://localhost:5432/myapp
hibernate.connection.username=postgres
hibernate.connection.password=1234
hibernate.connection.pool_size=30
Tuesday, August 7, 2012
32. daí percebem que não configuraram o
o pool do Hibernate
hibernate.properties
hibernate.connection.driver_class=org.postgresql.Driver
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.url=jdbc:postgresql://localhost:5432/myapp
hibernate.connection.username=postgres
hibernate.connection.password=1234
hibernate.connection.pool_size=30
Tuesday, August 7, 2012
33. a app volta a funcionar
bem por um tempo
Tuesday, August 7, 2012
34. a app volta a funcionar
bem por um tempo
Tuesday, August 7, 2012
35. e vão alocando mais conexões com o
tempo
hibernate.properties
hibernate.connection.pool_size=30
40
55
70
...
Tuesday, August 7, 2012
38. INFO DriverManagerConnectionProvider:64 - Using Hibernate built-in
connection pool (not for production use!)
INFO DriverManagerConnectionProvider:65 - Hibernate connection pool
size: 20
Tuesday, August 7, 2012
39. not for production use!
INFO DriverManagerConnectionProvider:64 - Using Hibernate built-in
connection pool (not for production use!)
INFO DriverManagerConnectionProvider:65 - Hibernate connection pool
size: 20
Tuesday, August 7, 2012
48. Pool traz melhoria de
performance
mas não faz milagres
Tuesday, August 7, 2012
49. #2
lidando com
LazyInitialization
Exception
Tuesday, August 7, 2012
50. quando e por que acontece?
Tuesday, August 7, 2012
51. @Entity
class
NotaFiscal
{
…
@OneToMany
List<Item>
itens;
}
Tuesday, August 7, 2012
52. Percorrendo os itens de uma nota
NotaFiscal
nf
=
(NotaFiscal)
session.load
(NotaFiscal.class,
42);
List<Item>
itens
=
nf.getItens();
Tuesday, August 7, 2012
53. Hibernate executa 2 selects
NotaFiscal
nf
=
(NotaFiscal)
session.load(NotaFiscal.class,
42);
select nf.* from NotaFiscal nf
where nf.id=42
List<Item>
itens
=
nf.getItens();
select i.* from Item i
where i.nota_fiscal_id=42
Tuesday, August 7, 2012
54. a session do Hibernate foi fechada
Session
session
=
sessionFactory.openSession();
NotaFiscal
nf
=
(NotaFiscal)
session.load
(NotaFiscal.class,
42);
session.close();
List<Item>
itens
=
nf.getItens();
System.out.println("numero
de
pedidos:"
+
itens.size());
Tuesday, August 7, 2012
55. mas ao ler os itens da nota
Session
session
=
sessionFactory.openSession();
NotaFiscal
nf
=
(NotaFiscal)
session.load
org.hibernate.LazyInitializationException:
(NotaFiscal.class,
42);
failed to lazily
session.close(); initialize a collection -
no session or session was closed.
List<Item>
itens
=
nf.getItens();
System.out.println("numero
de
pedidos:"
+
itens.size());
Tuesday, August 7, 2012
85. Caching Strategy
@Cache(
usage=CacheConcurrencyStrategy.READ_WRITE)
READ_ONLY Melhor performance
NONSTRICT_READ_WRITE
READ_WRITE
Tuesday, August 7, 2012
86. Caching Strategy
@Cache(
usage=CacheConcurrencyStrategy.READ_WRITE)
READ_ONLY
NONSTRICT_READ_WRITE Dados não críticos
READ_WRITE
Tuesday, August 7, 2012
94. modelo conceitual do cache
Issue Data Cache
17 -> [ “Bug #1”, “ABERTA” , 1 ]
18 -> [ “Bug #2”, “FECHADA”, 2 ]
19 -> [ “Bug #3”, “ABERTA” , 1 ]
não é uma árvore de objetos,
mas sim um "Map de Arrays"
Tuesday, August 7, 2012
95. 2nd Level Cache não faz cache
das associações
Tuesday, August 7, 2012
96. @Entity
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
class
Issue
{
@Id
private
Long
id;
private
String
descricao;
private
String
status;
@ManyToOne
private
Projeto
projeto;
@OneToMany
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
private
List<Comentario>
comentarios;
}
Tuesday, August 7, 2012
99. Com 2nd Level Cache tudo funciona bem
enquanto buscamos por ID...
session.load(Issue.class,
17);
Tuesday, August 7, 2012
100. Com 2nd Level Cache tudo funciona bem
enquanto buscamos por ID...
session.load(Issue.class,
17);
...mas e quando precisamos de uma
consulta um pouco diferente?
session
.createQuery("from
Issue
where
status
=
?")
.setString(0,"ABERTO")
.list();
Tuesday, August 7, 2012
111. o campeão em prejudicar
a performance da
aplicação
Tuesday, August 7, 2012
112. Processando os itens de uma nota
NotaFiscal
nf
=
(NotaFiscal)
session.load
(NotaFiscal.class,
42);
processaItensDaNota(nf);
Tuesday, August 7, 2012
113. Hibernate executa 2 selects
NotaFiscal
nf
=
(NotaFiscal)
session.load(NotaFiscal.class,
42);
select nf.* from NotaFiscal nf
where nf.id=42
processaItensDaNota(nf);
select i.* from Item i
where i.nota_fiscal_id=42
Tuesday, August 7, 2012
114. Processando os itens de varias notas
List<NotaFiscal>
notas
=
dao.listaTudo();
for
(NotaFiscal
nf
:
notas)
{
processaItensDaNota(nf);
}
Tuesday, August 7, 2012
115. Hibernate executa n+1 selects
List<NotaFiscal>
notas
=
dao.listaTudo();
select nf.* from NotaFiscal nf
for
(NotaFiscal
nf
:
notas)
{
processaItensDaNota(nf);
}
select i.* from Item i where i.nota_fiscal_id=?
select i.* from Item i where i.nota_fiscal_id=?
select i.* from Item i where i.nota_fiscal_id=?
select i.* from Item i where i.nota_fiscal_id=?
select i.* from Item i where i.nota_fiscal_id=?
...
Tuesday, August 7, 2012
134. SUBSELECT
@Entity
class
NotaFiscal
{
…
@OneToMany
@Fetch(FetchMode.SUBSELECT)
List<Item>
itens;
}
Tuesday, August 7, 2012
135. Hibernate executa 2 selects
List<NotaFiscal>
notas
=
dao.listaTudo();
select nf.* from NotaFiscal nf
for
(NotaFiscal
nf
:
notas)
{
processaItensDaNota(nf);
}
select i.* from Item i where
i.nota_fiscal_id in (select nf.id from
NotaFiscal nf)
Tuesday, August 7, 2012
152. API mais baixo nível
próxima ao jdbc
sem 1st Level Cache
mapeamento básico sem 2nd Level Cache
StatelessSession
sem cascade
sem dirty-checking
Collections são ignorados
sem modelo de
sem interceptors
eventos
Tuesday, August 7, 2012
153. StatelessSession
session
=
sf.openStatelessSession();
Transaction
tx
=
session.beginTransaction();
for
(
int
i=0;
i
<
100000;
i++
)
{
Produto
produto
=
new
Produto(...);
session.insert(produto);
}
tx.commit();
session.close();
Tuesday, August 7, 2012
154. menos consumo de memória
e mais rápida!
Tuesday, August 7, 2012
155. dá pra melhorar?
Yuri Adams
menos consumo de memória
e mais rápida!
Tuesday, August 7, 2012