![Page 1: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/1.jpg)
JDBC / JPA / Hibernate: Sans
maîtrise la puissance n’est rien!
Brice LEPORINI
Indépendant
@blep
http://the-babel-tower.github.io/
![Page 2: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/2.jpg)
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.
![Page 3: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/3.jpg)
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
![Page 4: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/4.jpg)
Pourquoi revenir dessus en
2014?
• Technologie largement utilisée dans les applications
Java
• Extrêmement rarement maîtrisée...
![Page 5: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/5.jpg)
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 [ ..... ] .... ]
![Page 6: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/6.jpg)
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
![Page 7: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/7.jpg)
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
![Page 8: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/8.jpg)
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!
![Page 9: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/9.jpg)
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
![Page 10: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/10.jpg)
Sans maitrise la puissance
n’est rien!
![Page 11: JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!](https://reader031.vdocuments.fr/reader031/viewer/2022013122/55a7b3771a28abbd168b462d/html5/thumbnails/11.jpg)
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