English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ce document résume les quatre méthodes que j'ai utilisées pour résoudre les problèmes de chargement paresseux de Hibernate pendant mon apprentissage.
Le chargement paresseux (lazy) signifie chargement différé, chargement à retardement.
Quand utiliser le chargement paresseux ? Je ne peux répondre que : utilisez le chargement paresseux lorsque vous devez.
Quant à pourquoi utiliser le chargement paresseux, c'est lorsque nous devons accéder à une quantité de données importante, il est évidemment peu approprié d'utiliser le cache, car la capacité de la mémoire est limitée. Pour réduire le nombre de connexions simultanées et la consommation des ressources système, nous laissons les données être chargées seulement lorsque cela est nécessaire. C'est à ce moment-là que nous utilisons le chargement paresseux.
Par exemple, il y a un objet Employee et un autre objet Department. Il est évident que pour Employee par rapport à Department, il s'agit d'une relation de plusieurs à un ; et pour Department par rapport à Employee, il s'agit d'une relation d'un à plusieurs. Lorsque nous cherchons un objet Employee, si nous voulons obtenir le Department correspondant via l'attribut department de l'objet employee, une exception sera lancée. Cela est dû à l'existence du chargement différé, après que la session soit fermée, Hibernate enverra une nouvelle fois une requête à la base de données, ce qui entraînera une exception.
Voici un résumé des quatre méthodes pour résoudre ce problème :
1.initialisation explicite (à l'intérieur de la méthode de recherche)
Lorsque vous devez rechercher à quel département appartient un employé, vous devez préalablement rechercher Department
en utilisant l'expression
Hibernate.initialize(Department.class);
2.modifier le fichier de relation d'objet, en changeant lazy en lazy=false, c'est-à-dire en désactivant le chargement différé
Ces deux méthodes résolvent effectivement le problème, mais leur inconvénient est que, quels que soient les objets utilisés après cela, Hibernate enverra des requêtes SQL à la base de données pour demander des données, ce qui entraîne une perte de performance inutile.
3.en utilisant le filtre (projet web)
①Le mode d'obtention de session doit utiliser getCurrentSession
②特殊的方式关闭session
public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2) lance IOException, ServletException { // TODO Auto-bouchon de méthode généré Session session = null; Transaction tx = null; try { session = HibernateUtil.getCurrentSession(); tx = session.beginTransaction(); arg2.doFilter(request, response);//La requête continue de se déplacer tx.commit(); } catch (Exception e) { // TODO: gérer l'exception if(tx != null){ tx.rollback(); } }finally{ //特殊的方式关闭 HibernateUtil.closeCurrentSession(); } }
4.Dans le cadre du cadre SSH, utilisez openSessionView fourni par Spring
Son principe est similaire à celui de la troisième méthode utilisant Filter, mais ce filter est fourni par Spring. Pour l'utiliser, il suffit de configurer le fichier web.xml comme suit :
<!-- Utilisation de Spring pour résoudre le problème de chargement différé --> <filter <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
et le3et le4Cette méthode peut également résoudre le problème de chargement différé, où le4Ces deux méthodes sont également parmi les plus utilisées à l'heure actuelle. Cependant, ces deux méthodes ont également leurs inconvénients, à savoir qu'elles prolongent le temps de fermeture de la session, et que la durée de vie de la session s'allonge. Avant l'utilisation de cette méthode, la session était fermée après l'interrogation des données ; maintenant, la fermeture de la session a lieu à la fin d'une requête web.
Résumé
Voici la discussion de cet article sur une brève discussion sur la résolution du chargement différé Hibernate4Tous les contenus de ce type, j'espère qu'ils seront utiles à tous. Les amis intéressés peuvent continuer à consulter d'autres sujets pertinents sur ce site. Si vous trouvez des insuffisances, n'hésitez pas à laisser un message. Merci de votre soutien à ce site !
Déclaration : Le contenu de cet article est issu du réseau, propriété de ses auteurs respectifs, le contenu est apporté par les utilisateurs d'Internet de manière volontaire et auto-publiée. Ce site ne détient pas de droits de propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)