Problèmes de chargement paresseux avec @Lob dans Spring et Hibernate
Dans les applications Web utilisant Spring et Hibernate, les enregistrements de base de données contenant des données liées aux fichiers sont rendu sur une page Web. Bien que le processus fonctionne correctement lorsque les volumes de données sont modestes, des quantités de données excessives déclenchent une "OutOfMemoryError".
Comme étape de dépannage initiale, la définition des propriétés "blobField" sur "null" a résolu le problème de mémoire, ce qui implique que la paresse le chargement était inefficace malgré l'annotation @Basic(fetch=FetchType.LAZY).
Explications et solutions de contournement
Selon la documentation Hibernate, les champs @Lob sont intrinsèquement paresseux et ne ne nécessite pas d'annotations Lazy explicites. Cependant, un comportement incohérent a été signalé dans les bases de données et les pilotes.
Une solution implique des techniques d'instrumentation de bytecode telles que Javassist ou Cglib.
Solution recommandée
Pour Pour résoudre ce problème de manière fiable, il est suggéré de restructurer les mappages de données. Au lieu d'utiliser des propriétés, créez de « faux » mappages un-à-un. Supprimez les champs LOB de la classe primaire, établissez de nouvelles classes référençant la même table et la même clé primaire mais contenant uniquement les champs LOB nécessaires. Marquez ces mappages comme un à un, récupérez la sélection et paresseux vrai. Cette approche garantit un chargement paresseux pendant que l'objet parent reste dans la session.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!