Cache de premier niveau d'hibernation
1. Le cache de premier niveau d'hibernation est également appelé « cache de session » et « cache de niveau session ».
2. Lors de l'interrogation d'une entité de la base de données via Session, l'entité sera stockée dans la mémoire la prochaine fois que vous interrogerez la même entité, elle ne sera plus obtenue de la base de données, mais de la mémoire. . Il s'agit de la mise en cache
3. Le cycle de vie du cache de premier niveau est le même que celui de la Session. Lorsque la Session est détruite, elle est également détruite.
4. La plage de données applicable dans le cache de premier niveau se situe dans la session en cours.
pourquoi (Pourquoi utiliser le cache Hibernate ?)
Hibernate est un framework de couche de persistance qui accède souvent à des bases de données physiques.
Afin de réduire la fréquence d'accès des applications aux sources de données physiques, améliorant ainsi les performances des applications.
Les données dans le cache sont une copie des données dans la source de données physique. L'application lit et écrit les données du cache au moment de l'exécution, les données dans le cache et le physique. la source de données sera synchronisée
quoi ( Quel est le principe du cache Hibernate ? ) Le cache Hibernate comprend deux catégories : le cache Hibernate de premier niveau et le cache Hibernate de deuxième niveau.
1.Le cache de premier niveau d'Hibernate est également appelé « Cache de session ».
La Session intégrée ne peut pas être déchargée et le cache de Session est un cache à l'échelle de la transaction (le cycle de vie de l'objet Session correspond généralement à une transaction de base de données ou à une transaction d'application).
Dans le cache de premier niveau, chaque instance d'une classe persistante possède un OID unique.
2.Le cache de deuxième niveau Hibernate est également appelé « cache SessionFactory ».
Étant donné que le cycle de vie de l'objet SessionFactory correspond à l'ensemble du processus de l'application, le cache de deuxième niveau Hibernate est un cache à l'échelle du processus ou du cluster. Des problèmes de concurrence peuvent survenir, donc un accès simultané approprié. Une stratégie doit être adoptée. Les politiques fournissent des niveaux d’isolation des transactions pour les données mises en cache.
Le cache de deuxième niveau est facultatif et est un plug-in configurable. SessionFactory n'activera pas ce plug-in par défaut.
Hibernate fournit l'interface org.hibernate.cache.CacheProvider, qui agit comme un adaptateur entre le plug-in de cache et Hibernate.
Quels types de données peuvent être stockés dans le cache de deuxième niveau ?
1) Données rarement modifiées
2) Données peu importantes, des données simultanées occasionnelles sont autorisées
3) Données qui ne seront pas accessibles simultanément
4) Données constantes
Données cela ne convient pas au stockage dans le cache de deuxième niveau ?
1) Données fréquemment modifiées
2) L'accès simultané à des données telles que les données financières n'est absolument pas autorisé
3) Données partagées avec d'autres applications.
API de gestion du cache de premier niveau
1.evict(), utilisé pour effacer un objet du cache de premier niveau de la session.
2.clear(), utilisé pour effacer tous les objets du cache de premier niveau.
Qurey.list() et Qurey.iterate()
1.Qurey.list() données de requête , ne recherchera pas dans le cache de premier niveau, n'enverra pas directement l'instruction SQL à la base de données et conservera l'objet renvoyé par la requête dans le cache.
2.Qurey.iterate() ne recherche pas dans le cache de premier niveau, mais envoie directement SQL à la base de données pour interroger l'identifiant Lorsque d'autres attributs de l'objet doivent être utilisés, l'objet est en premier. recherché dans le cache en fonction de l'identifiant. S'il n'y en a pas, envoyez ensuite une requête SQL à la base de données, donc utiliser cette méthode seule pour interroger entraînera un problème N+1 (c'est-à-dire l'envoi d'instructions N+1 à la base de données pour interroger les informations de N objets)
3. Si cette exigence existe : le même objet doit être accessible dans deux sessions différentes. Deux instructions SQL ou plus doivent être envoyées via Qurey.list() dans l'ordre. pour éviter de mettre en place un cache de deuxième niveau, Query.list() est utilisé dans la première session, dans la deuxième session, obtenez
hibernate deuxième-. cache de niveau (cache SessionFactory) directement via l'itération Qurey.iterate()
1 Ajoutez la configuration dans hibernate.cfg.xml
<!-- 开启二级缓存 --><property name="hibernate.cache.use_second_level_cache">true</property><!-- 二级缓存的提供类 在hibernate4.0版本以后我们都是配置这个属性来指定二级缓存的提供类--><property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property><!-- 二级缓存配置文件的位置 --><property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>
2. Pour plus de détails sur la configuration de ehcache.xml, voir
3 Configurer l'entité via des annotations et ajouter @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) devant la classe
Les valeurs communes des attributs CacheConcurrencyStrategysont READ_ONLY (les données de la table correspondant à l'entité sont uniquement lues puis mises en cache) et READ-WIRTE (les données de la table peuvent être lues ou mises à jour) 4. N'oubliez pas de noter : le cache de deuxième niveau d'Hibernate doit contenir l'objet entier. Si seuls certains attributs de l'objet sont interrogés, l'objet ne sera pas mis en cacheCache de requête (cache de niveau SessionFactory) 1 Basé sur le cache de deuxième niveau ci-dessus Continuer la configuration
2. Ajouter la configuration
dans hibernate.cfg.xml2. Ajoutez @Cacheable sur l'annotation d'entité
3. Appelez la méthode setCacheable(true) après l'instruction hql
4 Uniquement lorsque l'instruction de requête HQL est exactement la même, même les paramètres Les paramètres doivent être les mêmes, et le cache de requêtes est valide à ce moment
les trois états d'hibernation (transitoire (état transitoire), persistant (persistant état) et détaché (Hors ligne))
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!