Table des matières
2. Utilisez des ensembles de résultats de pagination et limiter
3. Optimiser les mappages d'entités et le chargement paresseux
4. Utilisez des projections DTO au lieu de pleine entités
5. Activer et régler le cache de deuxième niveau
6. Monitor et analyser SQL généré
7. Utilisez des requêtes natives pour des opérations complexes
8. Tirer les index de la base de données et expliquer les plans
Réflexions finales
Maison Java javaDidacticiel Optimisation des requêtes de base de données dans une couche de persistance Java

Optimisation des requêtes de base de données dans une couche de persistance Java

Jul 27, 2025 am 02:04 AM

1. Pour résoudre le problème de requête N 1, vous devez utiliser Join Fetch ou @entityGraph; 2. Restreignez la taille de l'ensemble de résultats grâce à la pagination et à la pagination du curseur; 3. Configurer raisonnablement le mappage des entités et le chargement paresseux pour éviter de charger trop de données associées; 4. Utiliser la projection DTO pour interroger uniquement les champs requis; 5. Activer la mise en cache secondaire et configurer raisonnablement les politiques de cache; 6. Activer les journaux SQL et utiliser des outils pour analyser les performances SQL générées; 7. Utiliser le SQL natif pour améliorer l'efficacité grâce à des opérations complexes; 8. Créer des index de base de données pour les conditions de requête communes et utiliser l'analyse du plan d'exécution; Le cœur de l'optimisation est de réduire les aller-retour de la base de données, de réduire la transmission des données et de sélectionner des stratégies d'acquisition appropriées basées sur le scénario, et finalement d'améliorer les performances en continu par le suivi.

Optimisation des requêtes de base de données dans une couche de persistance Java

Lorsque vous travaillez avec des applications Java qui s'appuient sur une couche de persistance - en particulier celles qui utilisent JPA (Java Persistance API) ou Hibernate - les performances de requête Database peuvent rapidement devenir un goulot d'étranglement. Les requêtes mal optimisées conduisent à des temps de réponse lents, à une utilisation élevée de la mémoire et à des problèmes d'évolutivité. Voici comment optimiser efficacement les requêtes de base de données dans une couche de persistance Java.

Optimisation des requêtes de base de données dans une couche de persistance Java

1. Évitez le problème de requête N 1

L'un des pièges de performance les plus courants dans JPA est le problème de la requête N 1 , qui se produit lors de la récupération d'une liste d'entités qui ont des associations chargées de paresseux.

Par exemple, le chargement d'une liste des entités Order , puis accéder Customer de chaque commande, un par un déclenche une requête distincte pour chaque client:

Optimisation des requêtes de base de données dans une couche de persistance Java
 List <ord> orders = EntityManager.CreateEquery ("Sélectionner O From Order O", Order.class)
                                  .getResultList ();

pour (commande d&#39;ordre: ordres) {
    System.out.println (order.getCustomer (). GetName ()); // déclenche une sélection individuelle
}

Solution : Utilisez JOIN FETCH dans votre JPQL pour charger avec impatience les associations dans une seule requête:

 List <ord> orders = EntityManager.Createequery (
    "Sélectionnez O dans l&#39;ordre o Join Fetch O.Customer", Order.class)
    .getResultList ();

Alternativement, utilisez @EntityGraph de HiberNate pour des plans de récupération plus réutilisables:

Optimisation des requêtes de base de données dans une couche de persistance Java
 @EntityGraph (attributepaths = "client")
@Query ("Sélectionner O dans l&#39;ordre O")
List <ordr> findallWithCustomer ();

2. Utilisez des ensembles de résultats de pagination et limiter

Rechercher de grands ensembles de données sans limites peut épuiser la mémoire et ralentir la base de données.

Paginez toujours les résultats lorsqu'ils traitent de grandes collections:

 Pagable pagable = pageRequest.of (0, 20); // page 0, taille 20
Page <Order> Orders = OrderRepository.Findall (Pagable);

Pensez également à utiliser la pagination de Keyset (basée sur le curseur) pour de meilleures performances sur les grands ensembles de données:

 @Query ("Sélectionner O dans l&#39;ordre o Where O.id>: Ordre du curseur par O.Id ASC")
List <ord> findnextbatch (@param ("curseur") curseur long, pagable pagable);

Cela évite OFFSET généraux décalés dans les grandes tables.


3. Optimiser les mappages d'entités et le chargement paresseux

  • Marquez les relations comme fetch = FetchType.LAZY sauf si vous avez toujours besoin des données associées.
  • Évitez les relations de vélo à moins que nécessaire.
  • Soyez prudent avec les collections @OneToMany : le chargement d'un parent avec des milliers d'enfants peut provoquer des pics de mémoire.

Au lieu de:

 @Onetomany (mappedBy = "Order")
Éléments de liste privée <C.C. // charge tous les éléments à chaque fois

Envisagez d'utiliser une requête dédiée pour récupérer les articles uniquement en cas de besoin, ou utiliser @BatchSize pour réduire les aller-retour:

 @Onetomany (mappedBy = "Order")
@BatchSize (taille = 10)
Éléments de liste privée <C.C.

Cela charge jusqu'à 10 éléments connexes dans une seule requête lorsqu'il est accessible.


4. Utilisez des projections DTO au lieu de pleine entités

Si vous n'avez besoin que d'un sous-ensemble de champs, ne chargez pas l'entité entière. Utilisez des projets DTO pour sélectionner uniquement ce qui est nécessaire:

 @Query ("Sélectionner un nouveau com.example.ordersummary (O.ID, O.Total, O.Customer.Name)"  
       "De l&#39;ordre o où o.status =: statut")
List <randumMary> finseSummariesByStatus (@param ("statut") statut de chaîne);

Cela réduit l'utilisation de la mémoire et les frais généraux du réseau en évitant la récupération des données inutile.

Vous pouvez également utiliser des projets basés sur des interfaces ou une prise en charge native de Spring Data pour les projets.


5. Activer et régler le cache de deuxième niveau

Hibernate prend en charge un cache de deuxième niveau pour stocker des entités ou des collections fréquemment accessibles à travers les sessions.

Activer la mise en cache pour les entités qui changent rarement:

 @Entité
@Cacheable
@ org.hibernate.annotations.cache (usage = cacheCurrencystrategy.read_only)
Produit de classe publique {...}

Utilisez des fournisseurs de cache comme ehcache ou de la caféine, et soyez prudent avec READ_WRITE ou NONSTRICT_READ_WRITE dans des environnements à haute curances.

Envisagez également de mettre en cache les résultats de la requête:

 query.sethint ("org.hibernate.cacheable", true);

Mais uniquement pour les requêtes avec des résultats stables.


6. Monitor et analyser SQL généré

Activer la journalisation SQL pour voir ce que les requêtes JPA génèrent réellement:

 printemps.jpa.show-sql = true
printemps.jpa.properties.hibernate.format_sql = true
logging.level.org.hibernate.sql = débogage
logging.level.org.hibernate.type.descriptor.sql.basicbinder = trace

Utilisez des outils tels que les statistiques Hibernate , P6Spy ou le profileur de requête de JOOQ pour identifier les requêtes lentes, les appels redondants ou les jointures inefficaces.


7. Utilisez des requêtes natives pour des opérations complexes

Parfois, JPQL ne suffit pas pour les requêtes critiques. Pour des rapports ou des analyses complexes, utilisez SQL natif:

 @Query (valeur = "Select O.id, O.Total, C.Name dans les commandes o Rejoignez les clients C sur O.Customer_ID = C.ID WHERE O.DATE>? 1",
       nativeQuery = true)
Liste <objet []> findOrderReports (Date locale);

Ou mappez les requêtes natives vers les DTO à l'aide @SqlResultSetMapping ou des projections de Spring Data.


8. Tirer les index de la base de données et expliquer les plans

Aucune quantité de réglage JPA ne peut corriger les index de base de données manquants.

  • Index des clés étrangères utilisées dans les jointures.
  • Colonnes d'index utilisées dans les certificats WHERE , ORDER BY et JOIN .
  • Utilisez EXPLAIN ou EXPLAIN ANALYZE pour comprendre les plans d'exécution de la requête.

Exemple:

 Créer un index idx_orders_customer sur les commandes (client_id);
Créer un index idx_orders_date_status sur les ordres (ordonnance_date, statut);

Réflexions finales

L'optimisation des requêtes de base de données dans une couche de persistance Java ne consiste pas seulement à rédiger un meilleur JPQL - il s'agit de comprendre comment JPA traduit votre code en SQL, de gérer judicieusement les associations et de tirer parti des capacités de base de données. Concentrez-vous sur la réduction des aller-retour, en minimisant le transfert de données et en utilisant la bonne stratégie de récupération pour chaque cas d'utilisation.

Fondamentalement: chercher moins, cache intelligent et mesurer toujours.

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1512
276
Java Virtual Threads Performance Benchmarking Java Virtual Threads Performance Benchmarking Jul 21, 2025 am 03:17 AM

Les fils virtuels présentent des avantages de performances significatifs dans les scénarios très concurrencés et IO, mais l'attention doit être accordée aux méthodes de test et aux scénarios applicables. 1. Les tests corrects devraient simuler des affaires réelles, en particulier les scénarios de blocage IO, et utiliser des outils tels que JMH ou Gatling pour comparer les threads de plate-forme; 2. L'écart de débit est évident, et il peut être plusieurs fois à dix fois supérieur à 100 000 demandes simultanées, car elle est plus légère et efficace dans la planification; 3. Pendant le test, il est nécessaire d'éviter de poursuivre aveuglément des nombres de concurrence élevés, de s'adapter aux modèles IO non bloquants et de prêter attention aux indicateurs de surveillance tels que la latence et le GC; 4. Dans les applications réelles, elle convient au backend Web, au traitement des tâches asynchrones et à un grand nombre de scénarios IO simultanés, tandis que les tâches à forte intensité de processeur sont toujours adaptées aux threads de plate-forme ou à Forkjoinpool.

Comment définir la variable d'environnement Java_Home dans Windows Comment définir la variable d'environnement Java_Home dans Windows Jul 18, 2025 am 04:05 AM

Tosetjava_homeonwindows, firstlocatethejdkinstallationpath (par exemple, c: \ Programfiles \ java \ jdk-17), thencreateasystemenvironmentVaria Blenamedjava_homewiththatpath.next, UpdateThepathvariableByAdding% java \ _home% \ bin et verifythesetupusingjava-versionandjavac-v

Comment gérer les transactions en Java avec JDBC? Comment gérer les transactions en Java avec JDBC? Aug 02, 2025 pm 12:29 PM

Pour gérer correctement les transactions JDBC, vous devez d'abord désactiver le mode de validation automatique, puis effectuer plusieurs opérations, et enfin vous engager ou randonner en fonction des résultats; 1. Appelez Conn.SetAutoCommit (false) pour démarrer la transaction; 2. Exécuter plusieurs opérations SQL, telles que l'insertion et la mise à jour; 3. Appelez Conn.Commit () Si toutes les opérations sont réussies, et appelez Conn.Rollback () Si une exception se produit pour garantir la cohérence des données; Dans le même temps, les ressources TRY-With doivent être utilisées pour gérer les ressources, gérer correctement les exceptions et clôturer les connexions pour éviter la fuite de connexion; De plus, il est recommandé d'utiliser des pools de connexion et de définir des points de sauvegarde pour réaliser un retour en arrière partiel, et de maintenir les transactions aussi courtes que possible pour améliorer les performances.

Implémentez une liste liée dans Java Implémentez une liste liée dans Java Jul 20, 2025 am 03:31 AM

La clé pour implémenter une liste liée est de définir des classes de nœuds et d'implémenter les opérations de base. ① premier créez la classe de nœud, y compris les données et les références au nœud suivant; ② Créez ensuite la classe LinkedList en implémentant les fonctions d'insertion, de suppression et d'impression; ③ La méthode d'ajout est utilisée pour ajouter des nœuds à la queue; ④ La méthode Printlist est utilisée pour produire le contenu de la liste liée; ⑤ La méthode DeleteWithValue est utilisée pour supprimer les nœuds avec des valeurs spécifiées et gérer différentes situations du nœud de tête et du nœud intermédiaire.

Java Microservices Service Mesh Intégration Java Microservices Service Mesh Intégration Jul 21, 2025 am 03:16 AM

ServiceMesh est un choix inévitable pour l'évolution de l'architecture de microservice Java, et son cœur réside dans le découplage de la logique réseau et du code commercial. 1. ServiceMesh gère l'équilibrage de la charge, le fusible, la surveillance et d'autres fonctions par le biais d'agents side-car pour se concentrer sur les entreprises; 2. Istio Envoy convient aux projets moyens et grands, et Linkerd est plus léger et adapté aux essais à petite échelle; 3. Les microservices Java devraient fermer la feigne, le ruban et d'autres composants et les remettre à Istiod pour la découverte et la communication; 4. Assurer l'injection automatique de side-car pendant le déploiement, prêter attention à la configuration des règles de trafic, à la compatibilité du protocole et à la construction du système de suivi des journaux, et adoptez la planification incrémentielle de la migration et de la surveillance pré-contrôler.

Optimisations du cadre avancé de la collection Java Optimisations du cadre avancé de la collection Java Jul 20, 2025 am 03:48 AM

Pour améliorer les performances de Java Collection Framework, nous pouvons optimiser à partir des quatre points suivants: 1. Choisissez le type approprié en fonction du scénario, tel que l'accès aléatoire fréquent à ArrayList, la recherche rapide vers HashSet et le concurrenthashmap pour les environnements simultanés; 2. Réglez les facteurs de capacité et de charge raisonnablement lors de l'initialisation pour réduire les frais généraux d'expansion de la capacité, mais éviter les déchets de mémoire; 3. Utilisez des ensembles immuables (tels que List.of ()) pour améliorer la sécurité et les performances, adaptés aux données constantes ou en lecture seule; 4. Empêcher les fuites de mémoire et utiliser des références faibles ou des bibliothèques de cache professionnelles pour gérer les ensembles de survie à long terme. Ces détails affectent considérablement la stabilité et l'efficacité du programme.

Comparaison des frameworks Java: Spring Boot vs Quarkus vs MicronAut Comparaison des frameworks Java: Spring Boot vs Quarkus vs MicronAut Aug 04, 2025 pm 12:48 PM

Pré-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusofperforming lightbetterine scénarios.

Construire des API RESTful à Java avec Jakarta EE Construire des API RESTful à Java avec Jakarta EE Jul 30, 2025 am 03:05 AM

Setupamaven / gradleprojectwithjax-rsDependces likejersey; 2.CreateArestResourceUsingannotationsSuchas @ pathand @ get; 3.ConfigureTheApplicationViaApplicationsUbclassorweb.xml; 4.AddjacksonforjsonBindingByCludingJersey-Media-Json-Jackson; 5.DeploEp

See all articles