Maison >Java >javaDidacticiel >Comment fonctionne le cache Hibernate de deuxième niveau ?

Comment fonctionne le cache Hibernate de deuxième niveau ?

PHPz
PHPzavant
2023-09-14 19:45:021261parcourir

Comment fonctionne le cache Hibernate de deuxième niveau ?

La mise en cache permet de réduire les appels réseau de base de données lors de l'exécution de requêtes.

Cache de niveau 1 et liaison de session. Il est implémenté implicitement. Un cache de niveau 1 existe jusqu'à ce que l'objet de session existe. Une fois l'objet de session terminé/fermé, il y aura Il n'y a aucun objet mis en cache. Le cache de deuxième niveau fonctionne pour plusieurs objets de session. c'est lié avec usine de sessions. Les objets de cache de deuxième niveau sont disponibles pour toutes les sessions Usine à session unique. Ces objets mis en cache seront terminés lorsqu'une session spécifique se produira L'usine est fermée.

Implémenter le cache L2

Nous devons ajouter les dépendances suivantes pour utiliser le cache de deuxième niveau.

<!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache -->
<dependency>
   <groupId>net.sf.ehcache</groupId>
   <artifactId>ehcache</artifactId>
   <version>2.10.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache -->
<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-ehcache</artifactId>
   <version>5.4.32.Final</version>
</dependency>

Remarque- Le numéro de version d'hibernate ehcache doit être le même que le numéro de version d'hibernate.

Maintenant, nous devons ajouter le fichier de configuration d'Hibernate qui permettra à Hibernate de se connecter à Base de données fournie et utilise un cache de deuxième niveau.

<!DOCTYPE hibernate-configuration PUBLIC
   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
   "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>
      <!-- JDBC Database connection settings -->
      <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
      <property name="connection.url">jdbc:mysql://localhost:3306/demo?useSSL=false</property>
      <property name="connection.username">root</property>
      <property name="connection.password">root</property>
      <!-- JDBC connection pool settings ... using built-in test pool -->
      <property name="connection.pool_size">4</property>
      <!-- Echo the SQL to stdout -->
      <property name="show_sql">true</property>
      //caching properties
      <property name="cache.use_second_level_cache">true</property>
      <property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
      <!-- Select our SQL dialect -->
      <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
      <!-- Drop and re-create the database schema on startup -->
      <property name="hbm2ddl.auto">create-drop</property>
      <!-- name of annotated entity class -->
      <mapping class="academy.company.Parent"/>
   </session-factory>
</hibernate-configuration>

Exemple

Par défaut, toutes les entités en Java ne sont pas mises en cache. Ainsi, pour activer la mise en cache des entités, nous utilisons les annotations @Cacheable et @Cache dans la classe d'entité Parent -

import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;

@Entity
@Table( name = " Employee")
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Parent {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   Long id;
   @Column(name = "first_name")
   String firstName;
   @Column(name = "last_name")
   String lastName;
}
Now, let’s check whether second level cache works:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Main {
   public static void main(String[] args) {
      SessionFactory sessionFactory = new Configuration()
         .configure("academy/company/hibernate.cfg.xml")
         .buildSessionFactory();
      Session session1 = sessionFactory.openSession();
      Parent parent1 = session1.get(Parent.class, 4);
      System.out.println(parent1.id + " " + parent1.firstName + " " + parent1.lastName);
      session1.close();
      
      Session session2 = sessionFactory.openSession();
      Parent parent2 = session2.get(Parent.class, 4);
      System.out.println(parent2.id + " " + parent2.firstName + " " + parent2.lastName);
      session2.close();
   }
}

Sortie

Hibernate: select parent0.id as id1, parent0.first_name as first_name1, parent0.last_name as last_name1 from Parent parent0 where parent0.id=?
1 Subash Chopra
1 Subash Chopra

Depuis la console, nous pouvons clairement voir qu'hibernate n'a exécuté qu'une seule requête pendant la session1. Désormais, lorsque session2 accède à la même requête, elle n'effectue pas d'appel réseau à la base de données pour l'exécuter. Au lieu de cela, puisque nous utilisons le cache de deuxième niveau, il obtiendra l'objet cache de la session1.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer