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

Bagaimanakah cache tahap kedua Hibernate berfungsi?

PHPz
Lepaskan: 2023-09-14 19:45:02
ke hadapan
1283 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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();
   }
}
Salin selepas log masuk

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
Salin selepas log masuk

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!

Label berkaitan:
sumber:tutorialspoint.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan