2017-05-20 5 views
0

Je veux être en mesure d'utiliser un gestionnaire d'entité pour valider plusieurs transactions pour des actions CRUD concernant différents objets d'entité. Par exemple, je veux être capable de supprimer un objet entité chat et de créer un nouvel objet entité chien tout au long d'une session de gestionnaire d'entité. J'atteignons cet objectif en ayant la catService et dogService (les objets qui peuvent objets CRUD) étendre un GenericService:La validation de plusieurs transactions au cours d'une même session augmente-t-elle les performances?

public abstract class GenericService<T> { 
private Class<T> type; 
protected static EntityManager entityManager; 

public GenericService() { 
    Type t = getClass().getGenericSuperclass(); 
    ParameterizedType pt = (ParameterizedType) t; 
    type = (Class) pt.getActualTypeArguments()[0]; 
    if (entityManager == null || !entityManager.isOpen()) entityManager = GetEntityManager.getInstance(); // zo kunnen meerdere services gebruik maken van dezelfde entitymanager sessie. 1 operation per sessie is een antipattern namelijk. Beter meerdere operations in 1 sessie doen. 
} 

// sluit entityManager en daarmee dus ook de sessie af. 
public void close(){ 
    entityManager.close(); 
} 

Maintenant, les deux services partagent le même entitymanager. Maintenant, je peux effectuer plusieurs transactions et appeler la méthode close() héritée uniquement sur le dernier objet Service, qui ferme ensuite le gestionnaire d'entités partagées. J'ai l'intention de faire une application Web et je me demandais si l'utilisation plus efficace des sessions de gestionnaire d'entités en les partageant avec différents objets service opérant sur différents objets d'entité aurait un gain de performance par rapport à l'ouverture et la fermeture d'une session. gestionnaire d'entité) pour une seule transaction.

Merci.

Répondre

1

La session par opération est un anti-pattern mais pas pour des raisons de performances. Vous pouvez faire beaucoup de calculs supplémentaires (comme créer des sessions) et ne pas remarquer de différence de performances car attendre une base de données pour compléter une transaction prend beaucoup de temps par rapport à des calculs supplémentaires (les opérations d'E/S de base de données prennent plusieurs millisecondes nanosecondes à compléter).

Depuis vous avez l'intention de faire une application web, essayez d'utiliser sessionFactory.getCurrentSession() Hibernate qui ne sorte de ce que vous faites maintenant dans le constructeur de la GenericService - plus d'informations dans le user guide, this answer et javadocs.

+0

n'augmenterait-il pas les performances en réduisant la quantité d'objets de session actifs (ou d'objets Entity Manager) stockés en mémoire? – Maurice

+1

Je doute que vous remarquiez l'augmentation de la performance. Essayez de mesurer l'augmentation des performances dans une configuration de type production (par exemple en utilisant une base de données réelle, pas une base de données en mémoire) pour les deux scénarios (réutilisation d'une session par opposition à la création de nouvelles à chaque fois). Je pense que vous trouverez que l'augmentation de la performance est à peine mesurable. Mon point principal ici est de me concentrer d'abord sur un code de bonne qualité (faire la bonne chose) et ne pas trop m'inquiéter de la performance tant que le besoin s'en fait sentir (par exemple quand la réponse d'une requête web est trop lente). – vanOekel