Rumah >Java >javaTutorial >Bagaimanakah cache tahap kedua Hibernate berfungsi?

Bagaimanakah cache tahap kedua Hibernate berfungsi?

PHPz
PHPzke hadapan
2023-09-14 19:45:021261semak imbas

Bagaimanakah cache tahap kedua Hibernate berfungsi?

Caching membantu mengurangkan panggilan rangkaian pangkalan data apabila melaksanakan pertanyaan.

Tahap 1 cache dan pemautan sesi. Ia dilaksanakan secara tersirat. Cache tahap 1 wujud sehingga objek sesi wujud. Sebaik sahaja objek sesi ditamatkan/ditutup akan ada Tiada objek cache. Cache tahap kedua berfungsi untuk berbilang objek sesi. ia dipautkan dengan kilang sesi. Objek cache peringkat kedua tersedia untuk semua sesi Kilang sesi tunggal. Objek cache ini akan ditamatkan apabila sesi tertentu berlaku Kilang tutup.

Laksanakan cache L2

Kita perlu menambah kebergantungan berikut untuk menggunakan cache tahap kedua.

<!-- 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>

Nota- Nombor versi hibernate ehcache mestilah sama dengan nombor versi hibernate.

Kini kita perlu menambah fail konfigurasi hibernate yang akan membolehkan hibernate disambungkan Pangkalan data yang disediakan dan menggunakan cache tahap kedua.

<!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>

Contoh

Secara lalai, semua entiti dalam java tidak dicache. Jadi, untuk mendayakan caching entiti, kami menggunakan anotasi @Cacheable dan @Cache dalam kelas entiti Induk -

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();
   }
}

Output

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

Daripada konsol kita dapat melihat dengan jelas bahawa hibernate hanya melaksanakan satu pertanyaan semasa sesi1. Kini, apabila session2 mengakses pertanyaan yang sama, ia tidak membuat panggilan rangkaian ke pangkalan data untuk melaksanakannya. Sebaliknya, kerana kami menggunakan cache tahap kedua, ia akan mendapat objek cache daripada session1.

Atas ialah kandungan terperinci Bagaimanakah cache tahap kedua Hibernate berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam