Java의 2차 캐시에 대한 자세한 설명
이 글은 주로 Java의 hibernate 2차 캐시에 대한 자세한 설명을 소개하고 있는데, 편집자는 꽤 좋다고 생각합니다. 이제 참고용으로 공유하겠습니다. 편집기를 따라 살펴보겠습니다
Hibernate의 2차 캐시
1. 캐시 개요
캐시 ): 컴퓨터 분야에서 매우 일반적인 개념입니다. 이는 애플리케이션과 영구 데이터 저장 소스(예: 하드 디스크의 파일 또는 데이터베이스) 사이에 위치하며, 해당 기능은 애플리케이션이 영구 데이터 저장 소스를 직접 읽고 쓰는 빈도를 줄여 애플리케이션의 실행을 향상시키는 것입니다. 성능. 캐시의 데이터는 데이터 저장소 원본에 있는 데이터의 복사본입니다. 캐시의 물리적 매체는 일반적으로 메모리입니다.
hibernate는 두 가지 수준의 캐시를 제공합니다.
캐시의 첫 번째 수준은 세션 레벨 캐시(트랜잭션 범위 캐시) 이 캐시 수준은 최대 절전 모드로 관리되며 일반적으로 개입이 필요하지 않습니다
Hibernate의 캐시는 두 가지 범주로 나눌 수 있습니다:
2. 2차 캐시의 동시 액세스 전략 이해
3. 프로세스 전체의 2차 캐시 구성(ehcache 캐시 구성)
1 ehcache-1.5를 복사합니다. 0.jar을 현재 프로젝트의 lib 디렉토리에 복사current 및 commons-logging
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider</property>
객체의 간단한 속성을 캐시하지만 컬렉션 속성은 캐시되지 않음을 나타냅니다. <set> 요소에
<!-- 指定使用二级缓存的类 放在maping下面 --> <!-- 配置类级别的二级缓存 --> <class-cache class="com.sihai.c3p0.Customer" usage="read-write"/> <class-cache class="com.sihai.c3p0.Order" usage="read-write"/> <!-- 配置集合级别的二级缓存 --> <collection-cache collection="com.sihai.c3p0.Customer.orders" usage="read-write"/>
구성 파일 구성 ehcache.xml(고정 이름)(클래스 경로에 위치)
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="c:/ehcache"/> <defaultCache maxElementsInMemory="5" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /> </ehcache>
4. 테스트
package com.sihai.hibernate3.test; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import com.sihai.hibernate3.demo1.Customer; import com.sihai.hibernate3.demo1.Order; import com.sihai.utils.HibernateUtils; public class HibernateTest6 { @Test // 查询缓存的测试 public void demo9(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Query query = session.createQuery("select c.cname from Customer c"); // 使用查询缓存: query.setCacheable(true); query.list(); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); query = session.createQuery("select c.cname from Customer c"); query.setCacheable(true); query.list(); tx.commit(); } @SuppressWarnings("unused") @Test // 更新时间戳 public void demo8(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 2); session.createQuery("update Customer set cname = '奶茶' where cid = 2").executeUpdate(); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer2 = (Customer) session.get(Customer.class, 2); tx.commit(); } @SuppressWarnings("all") @Test // 将内存中的数据写到硬盘 public void demo7(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); List<Order> list = session.createQuery("from Order").list(); tx.commit(); } @Test // 一级缓存的更新会同步到二级缓存: public void demo6(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 1); customer.setCname("芙蓉"); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer2 = (Customer) session.get(Customer.class, 1); tx.commit(); } @SuppressWarnings("unchecked") @Test // iterate()方法可以查询所有信息. // iterate方法会发送N+1条SQL查询.但是会使用二级缓存的数据 public void demo5(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // N+1条SQL去查询. Iterator<Customer> iterator = session.createQuery("from Customer").iterate(); while(iterator.hasNext()){ Customer customer = iterator.next(); System.out.println(customer); } tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); iterator = session.createQuery("from Customer").iterate(); while(iterator.hasNext()){ Customer customer = iterator.next(); System.out.println(customer); } tx.commit(); } @SuppressWarnings("unchecked") @Test // 查询所有.Query接口的list()方法. // list()方法会向二级缓存中放数据,但是不会使用二级缓存中的数据. public void demo4(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); // 查询所有客户: // list方法会向二级缓存中放入数据的. List<Customer> list = session.createQuery("from Customer").list(); for (Customer customer : list) { System.out.println(customer.getCname()); } tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); // Customer customer = (Customer) session.get(Customer.class, 1);// 没有发生SQL ,从二级缓存获取的数据. // list()方法没有使用二级缓存的数据. list = session.createQuery("from Customer").list(); for (Customer customer : list) { System.out.println(customer.getCname()); } tx.commit(); } @Test // 二级缓存的集合缓冲区特点: public void demo3(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class, 1); // 查询客户的订单. System.out.println("订单的数量:"+customer.getOrders().size()); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer2 = (Customer) session.get(Customer.class, 1); // 查询客户的订单. System.out.println("订单的数量:"+customer2.getOrders().size()); tx.commit(); } @SuppressWarnings("unused") @Test // 配置二级缓存的情况 public void demo2(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer1 = (Customer) session.get(Customer.class, 1);// 发送SQL. Customer customer2 = (Customer) session.get(Customer.class, 1);// 不发送SQL. System.out.println(customer1 == customer2); tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer3 = (Customer) session.get(Customer.class, 1);// 不发送SQL. Customer customer4 = (Customer) session.get(Customer.class, 1);// 不发送SQL. System.out.println(customer3 == customer4); tx.commit(); } @SuppressWarnings("unused") @Test // 没有配置二级缓存的情况 public void demo1(){ Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); Customer customer1 = (Customer) session.get(Customer.class, 1);// 发送SQL. Customer customer2 = (Customer) session.get(Customer.class, 1);// 不发送SQL. tx.commit(); session = HibernateUtils.getCurrentSession(); tx = session.beginTransaction(); Customer customer3 = (Customer) session.get(Customer.class, 1);// 发送SQL. tx.commit(); } }
특별 추천: "php 프로그래머 툴박스 ”V0.1 버전 다운로드
2. 3.위 내용은 Java의 2차 캐시에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Mybatis의 첫 번째 수준 캐시는 기본적으로 활성화되어 있으며 SqlSession 수준에 있습니다. 이는 동일한 SqlSession의 여러 쿼리가 이 수준의 캐시를 활용한다는 것을 의미합니다. 첫 번째 수준 캐시는 주로 쿼리 결과를 저장합니다. 쿼리 작업을 실행할 때 MyBatis는 매핑 문과 쿼리 결과 간의 매핑 관계뿐만 아니라 쿼리 결과 데이터도 캐시에 저장합니다. mybatis의 두 번째 수준 캐시는 첫 번째 수준 캐시와 다릅니다. 두 번째 수준 캐시는 각 SqlSession의 첫 번째 수준 캐시와 달리 애플리케이션 전체에서 공유됩니다.

MyBatis 캐싱 메커니즘 분석: 1단계 캐시와 2단계 캐시의 차이점 및 적용 MyBatis 프레임워크에서 캐싱은 데이터베이스 작업 성능을 효과적으로 향상시킬 수 있는 매우 중요한 기능입니다. 그중 1단계 캐시와 2단계 캐시는 MyBatis에서 일반적으로 사용되는 두 가지 캐싱 메커니즘입니다. 이 기사에서는 1차 수준 캐시와 2차 수준 캐시의 차이점과 적용을 자세히 분석하고 설명할 구체적인 코드 예제를 제공합니다. 1. 레벨 1 캐시 레벨 1 캐시는 로컬 캐시라고도 하며 기본적으로 활성화되어 있으며 끌 수 없습니다. 첫 번째 수준 캐시는 SqlSes입니다.

SpringBoot 프로젝트 서문에 Hibernate 통합하기 Hibernate는 지속성 작업을 용이하게 하기 위해 Java 객체를 데이터베이스 테이블에 매핑할 수 있는 널리 사용되는 ORM(Object Relational Mapping) 프레임워크입니다. SpringBoot 프로젝트에서 Hibernate를 통합하면 데이터베이스 작업을 더 쉽게 수행하는 데 도움이 될 수 있습니다. 이 기사에서는 SpringBoot 프로젝트에 Hibernate를 통합하는 방법을 소개하고 해당 예제를 제공합니다. 1.종속성 소개pom.xml 파일에 다음 종속성을 소개합니다: org.springframework.bootspring-boot-starter-data-jpam

Java는 소프트웨어 개발 분야에서 널리 사용되는 객체 지향 프로그래밍 언어입니다. Hibernate는 Java 객체의 지속성을 관리하는 간단하고 효율적인 방법을 제공하는 인기 있는 Java 지속성 프레임워크입니다. 그러나 개발 과정에서 Hibernate 오류가 자주 발생하며, 이러한 오류로 인해 프로그램이 비정상적으로 종료되거나 불안정해질 수 있습니다. Hibernate 오류를 처리하고 방지하는 방법은 Java 개발자가 숙달해야 하는 기술이 되었습니다. 이 기사에서는 몇 가지 일반적인 Hib를 소개합니다.

최대 절전 모드와 mybatis의 차이점: 1. 구현 방법 2. 성능 3. 개체 관리 비교 4. 캐싱 메커니즘 자세한 소개: 1. 구현 방법인 Hibernate는 객체를 데이터베이스 테이블에 매핑하는 완전한 객체/관계형 매핑 솔루션인 반면, MyBatis는 개발자가 SQL 문과 ResultMap을 수동으로 작성해야 합니다. 2. 성능, Hibernate는 개발 속도 측면에서 가능합니다. MyBatis는 Hibernate가 DAO 레이어 등을 단순화하기 때문입니다.

Hibernate의 일대다 및 다대다 Hibernate는 Java 애플리케이션과 관계형 데이터베이스 간의 데이터 액세스를 단순화하는 탁월한 ORM 프레임워크입니다. Hibernate에서는 복잡한 데이터 모델을 처리하기 위해 일대다 및 다대다 관계를 사용할 수 있습니다. Hibernate의 일대다 Hibernate에서 일대다 관계는 하나의 엔터티 클래스가 여러 개의 다른 엔터티 클래스에 대응한다는 것을 의미합니다. 예를 들어, 하나의 주문은 여러 주문 항목(OrderItem)에 해당할 수 있고, 사용자(User)는 여러 주문(Order)에 해당할 수 있습니다. Hibernate에서 일대다 관계를 구현하려면, 저장할 엔터티 클래스에 컬렉션 속성을 정의해야 합니다.

mybatis 보조 캐시 구성 단계: 1. 보조 캐시를 활성화합니다. 3. 캐시의 동시성 수준을 지정합니다. 4. 보조 캐시를 삭제합니다. MyBatis는 쿼리 성능을 향상시키기 위해 두 번째 수준 캐시 기능을 제공합니다. 두 번째 수준 캐시는 데이터베이스에 대한 액세스 횟수를 줄이고 애플리케이션 성능을 향상시킬 수 있습니다. 두 번째 수준 캐시를 사용할 때는 여러 스레드가 동시에 동일한 데이터를 수정하지 않도록 스레드 안전 문제에 주의해야 합니다.

인터넷의 대중화와 정보화 과정의 가속화로 인해 데이터의 양이 폭발적으로 증가하고, 개발 과정에서 직면하는 문제는 점점 더 복잡해지고 있습니다. 캐싱 기술의 출현은 매우 좋은 솔루션이 되었으며 시스템의 성능과 안정성을 향상시킬 수 있습니다. 이러한 기술 중 2차 캐시는 애플리케이션에 직접적으로 참여하여 우리에게 많은 실질적인 가치를 제공합니다. 이 기사에서는 Java 캐시 기술의 2단계 캐시를 소개합니다. 1. 캐싱 기술이란? 캐싱 기술은 컴퓨터 분야에서 일반적으로 사용되는 성능 최적화 방법입니다.
