View
170
Download
3
Category
Preview:
Citation preview
JDBC / JPA / Hibernate: Sans
maîtrise la puissance n’est rien!
Brice LEPORINI
Indépendant
@blep
http://the-babel-tower.github.io/
Présentation
• JDBC: Interface d’échange avec les SGBD
• Hibernate: ORM, né en 2002 des frustrations des EJB2
entities
• JPA: Spécification du JCP. Hibernate implémente JPA.
JPA: Recette de base<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="testPu" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect"
value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.connection.url"
value="jdbc:h2:mem:test"/>
<property name="hibernate.connection.username" value="sa"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.connection.driver_class"
value="org.h2.Driver"/>
</properties>
</persistence-unit>
</persistence>
@Entity
@Getter @Setter
@EqualsAndHashCode(exclude = "id")
public class User{
@Id
private Long id;
@Column(unique = true,nullable = false)
private String name;
}
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("testPu");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
final User user = new User();
user.setName("balibalo");
•Verser 50g de configuration XML dans META-INF
•Délayer 40g d’annotation dans chaque POJO pour
le mappage
•Mettre une implémentation dans le Class Path
•Démarrer l’unité de persistance pour faire prendre le
tout
•C’est prêt!
1
2
3
Pourquoi revenir dessus en
2014?
• Technologie largement utilisée dans les applications
Java
• Extrêmement rarement maîtrisée...
Cache L1
• Ou cache de session
• Scalabilité!
• Attention au cache obsolète entre les sessions:
• Sessions longues (batches, Stateful)
• Transactions indépendantes:
Tx REQUIRED[ ... Tx REQUIRES_NEW [ ..... ] .... ]
N+1 @OneToOne
• Java ne permet pas de «proxifier» la valeur null
• Le choix de la propriété (ownership) de la relation est
donc primordial
• Alternatives
• Fusion
• Héritage
•@Embeddable
Interrogation
• Inline: Jamais (ou tests)
• Named Queries / Repo Spring Data: requêtes statiques
• API Criteria:
• Non typée: Jamais
• Meta-modèle: Requêtes construites dynamiquement
Dimensionner un pool JDBC
• Quelles métriques?
• Ratio utilisateurs par connexion
• Ratio threads par connexion
• 42
• Quel est le délai acceptable pour obtenir une connexion?0 ms!
Dimensionner un pool JDBC
• Pas de recette miracle, dépend de l’application
• Tester l’application dans des conditions représentatives
• Scruter les logs à la recherche de messages
d’assèchement
• Positionner un timeout faible et recenser les erreurs
• Initial = Idle = Max
Sans maitrise la puissance
n’est rien!
Références
• JSR 338: JavaTM Persistence 2.1:
https://jcp.org/en/jsr/detail?id=338
• Documentation Hibernate
http://hibernate.org/orm/documentation/
• Patrycja Wegrzynowicz: Performance Anti-Patterns in Hibernate:
https://parleys.com/play/514892290364bc17fc56c48b
• Ippon :Formation JPA Avancé / Hibernate
http://fr.slideshare.net/ippontech/jpa-avanc-hibernate
Recommended