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();
•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

JDBC / JPA / Hibernate: Sans maîtrise la puissance n’est rien!

  • 1.
    JDBC / JPA/ Hibernate: Sans maîtrise la puissance n’est rien! Brice LEPORINI Indépendant @blep http://the-babel-tower.github.io/
  • 2.
    Présentation • JDBC: Interfaced’échange avec les SGBD • Hibernate: ORM, né en 2002 des frustrations des EJB2 entities • JPA: Spécification du JCP. Hibernate implémente JPA.
  • 3.
    JPA: Recette debase <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(); •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
  • 4.
    Pourquoi revenir dessusen 2014? • Technologie largement utilisée dans les applications Java • Extrêmement rarement maîtrisée...
  • 5.
    Cache L1 • Oucache de session • Scalabilité! • Attention au cache obsolète entre les sessions: • Sessions longues (batches, Stateful) • Transactions indépendantes: Tx REQUIRED[ ... Tx REQUIRES_NEW [ ..... ] .... ]
  • 6.
    N+1 @OneToOne • Javane 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
  • 7.
    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
  • 8.
    Dimensionner un poolJDBC • Quelles métriques? • Ratio utilisateurs par connexion • Ratio threads par connexion • 42 • Quel est le délai acceptable pour obtenir une connexion?0 ms!
  • 9.
    Dimensionner un poolJDBC • 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
  • 10.
    Sans maitrise lapuissance n’est rien!
  • 11.
    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