2012-04-30 2 views
1

Actuellement j'utilise JPA. Ce que je voudrais savoir est le suivant:Performance des mappages JPA

J'ai beaucoup de tables mappées les unes aux autres. Quand je regarde le journal, je vois que beaucoup d'informations sont extraites de la base de données après une simple requête. Que se passera-t-il s'il y a beaucoup de questions à la fois? Ou cela fonctionnera-t-il bien? Comment puis-je augmenter les performances?

+0

Par productivité, vous voulez dire performance, n'est-ce pas? – flash

+0

Oui, la performance –

Répondre

1

La structure ORM est surchargée. Parce qu'il est assez haut niveau, il a parfois besoin de générer beaucoup de requêtes SQL natives pour obtenir ce que vous voulez dans une ou deux lignes de JPQL ou EntityManager opérations pures. Cependant, JPA utilise deux caches - L1 et L2. L'un opère au niveau des entités, l'autre au niveau PersistenceUnits. Par conséquent, vous pouvez voir beaucoup de requêtes SQL générées, mais après un certain temps, certaines données doivent être mises en cache. Si vous n'êtes pas satisfait de la performance, vous pouvez essayer d'utiliser des collections chargées paresseuses ou d'aller chercher les données requises par vous-même (vous pourriez être intéressé par Bozho's post à ce sujet). Enfin, si vous constatez que le cache n'a pas amélioré vos performances et que les requêtes JPQL faites à la main ne fonctionnent pas correctement, vous pouvez toujours revenir aux requêtes SQL simples. Attention, ces requêtes contournent les caches JPA et peuvent nécessiter de faire des vidages avant d'exécuter la requête native (ou de l'invoquer au début de la transaction active).

En dépit de la route d'optimisation que vous choisirez - d'abord, , testez dans votre environnement et répondez si vous avez besoin de cette optimisation. Faire des tests lourds, des tests de performance et ainsi de suite.

"L'optimisation prématurée est la racine de tous les maux." D. Knuth

1

Si vous avez vraiment beaucoup d'entités mappées ensemble, cela pourrait en effet conduire à un problème de performances. Ce sera généralement le cas si vous avez beaucoup de @OneToMany ou @ManyToMany applications:

@Entity 
public class A { 
    @OneToMany 
    private List<B> listB; 

    @ManyToMany 
    private List<C> listC; 

    @OneToMany 
    private List<D> listD; 
    ... 
} 

Cependant une chose que vous pourriez faire, utilise le chargement tardif. Cela signifie que le chargement d'un champ peut être retardé jusqu'à ce qu'il soit accédé pour la première fois. Vous pouvez le faire en utilisant l'attribut fetch:

@Entity 
public class A { 
    @OneToMany(fetch=FetchType.LAZY) 
    private List<B> listB; 

    @ManyToMany(fetch=FetchType.LAZY) 
    private List<C> listC; 

    @OneToMany(fetch=FetchType.LAZY) 
    private List<D> listD; 
    ... 
} 

Dans l'exemple ci-dessus, cela signifie listeB, listC, listd ne sera pas tiré par les cheveux de la DB jusqu'à ce que le premier accès à la liste.

L'implémentation concrète de la récupération différée dépend de votre fournisseur JPA.