소개
우리의 지식은 프로그램의 병목 현상이 데이터베이스에 있으며, 메모리 속도가 하드 디스크의 속도보다 훨씬 빠르다는 것을 알고 있습니다. 부서가 동일한 데이터를 반복적으로 얻어야 할 때 부서는 데이터베이스 또는 원격 서비스를 계속해서 요청하여 데이터베이스 쿼리 또는 원격 메소드 호출에 많은 시간을 소비하여 프로그램 성능이 악화되어 데이터 캐시가 해결 해야하는 문제입니다.
봄 캐싱 지원
Spring은 org.springframework.cache.cachemanager 및 org.springframework.cache.cache 인터페이스를 정의하여 다양한 캐싱 기술을 통합합니다. 그 중 Cachemanager는 Spring에서 제공하는 다양한 캐시 기술에 대한 추상 인터페이스입니다. 캐시 인터페이스에는 다양한 캐시 작업이 포함되어 있습니다 (캐시를 얻기 위해 추가 및 삭제, 우리 시스템은 일반적 으로이 인터페이스를 직접 처리하지 않습니다).
Cachemanager는 봄에 의해 지원됩니다
다른 캐싱 기술의 경우 다양한 캐시 메나기를 구현해야합니다. Spring은 다음 표에서 CacheManager 구현을 정의합니다.
Cachemanager를 구현할 때는 Cachemanager를 구현하는 Bean을 등록해야합니다. 물론 각 캐싱 기술에는 많은 추가 구성이 있지만 Cachemanager를 구성하는 것이 필수적입니다.
선언적 캐시 주석
Spring은 캐시 규칙을 선언하기위한 4 개의 주석을 제공합니다 (주석이 달린 공식을 사용하여 AOP의 생생한 예).
선언적 캐시를 켜십시오
선언적 캐싱 지원을 켜는 것은 매우 간단합니다. 구성 클래스에서 @enabelCaching 주석 만 사용하면됩니다.
SpringBoot 지원
Spring China에서 캐시 기술을 사용하는 핵심은 CacheManager를 구성하는 것입니다. Springbok은 우리 도어의 여러 CachManager 구현을 자동으로 구성합니다. Spring Boot 환경에서 캐시 기술 사용은 프로젝트에서 관련 캐시 기술의 종속성 패키지를 가져 와서 @enabelCaching을 사용하여 캐시 지원을 활성화하기 위해 클래스를 구성해야합니다.
작은 예
SpringBoot+JPA+캐시를 사용하여 작은 예제가 구현됩니다.
예제 단계 디렉토리
1. Maven 프로젝트를 만듭니다
다음과 같이 새 Maven Project Pom.xml 파일을 만듭니다.
<? xml version = "1.0"encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0"xmlns : xsi = "http://www.w3.org/2001/xmlschema-instance" xsi : schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.xsd"> <modeversion> 4.0.0 </modelversion> <groupid> com.us <artifacceed> springboot </artifactid> <버전> 1.0-snapshot </version> <부모> <groupid> org.springframework.boot </groupid> <artifactid> Spring-Boot-Starter-Parent </artifactid> <3.0.Release </version> </parent> <tart-class> com.us.application </start class class> <maven.compiler.target> 1.8 </maven.compiler.target> <maven.compiler.source> 1.8 </maven.compiler.source> </properties> <!-웹 응용 프로그램에 대한 전형적인 종속성 추가-> <pecienties> <pecientency> <grouplid> org.springframwork. <artifactid> Spring-Boot-starter-cache </artifactid> </fectionency> <pectionement> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-springter-data-jpa </artifactid> </dependency> <groupid> org.springfringfringfratwort <Artifactid> Spring-Boot-starter-web </artifactid> </fectionement> <pectomency> <groupid> net.sf.ehcache </groupid> <artifactid> ehcache </artifactid> </dependency> <!-db-> <pelection> <groupid> mysql </groupid> <Artifactid> mysql-connector-java </artifactid> <bersion> 6.0.5 </version> </dependency> <groupid> com.mchange </groupid> <artifactid> c3p0 </artifactid> </versions> <groupid> commons-logging </groupid> <itifactid> Commons-Logging </artifactid> </exclusion> </exclusions> </fectionement> </fectencies> </project>
2. 데이터베이스 구성
SRC/Main/Esouches 디렉토리에 새 application.properties 파일을 만듭니다. 컨텐츠는 다음과 같이 데이터베이스 연결 정보입니다.
application.properties
Ms.db.driverclassName = com.mysql.jdbc.driverms.db.url = jdbc : mysql : // localhost : 3306/cache? prepstmtCachesize = 517 & cacheprepstmts = true & autoreconnec t = true & useUnicode = true & charac
새 dbconfig.java 구성 파일 생성 및 데이터 소스 구성
package com.us.example.config;/*** Yangyibo가 17/1/13에 생성했습니다. */import java.beans.propertyVetoException; import org.springframework.beans.beans.annotation.autowired; import org.sprameframework.context.annotation.bean; import org.spram.spramework.context.annotation.configuration; import org.springframwork.core.env com.mchange.v2.c3p0.combopooleddatasource; @configurationpublic class dbconfig {@autowired private 환경 Env; @Bean (이름 = "DataSource") Public ComboPooledDatasource DataSource ()는 PropertyVetoException {ComboPooledDatasource DataSource = New ComboPooledDatasource (); DataSource.setDriverClass (Env.getProperty ( "Ms.db.driverClassName")); DataSource.setjdbcurl (Env.getProperty ( "ms.db.url")); DataSource.setUser (Env.GetProperty ( "Ms.db.username")); DataSource.setPassword (Env.GetProperty ( "Ms.db.Password")); DataSource.setMaxPoolsize (20); DataSource.setminpoolsize (5); DataSource.setinitialpoolsize (10); DataSource.SetMaxIdletime (300); DataSource.SetAcquireIncrement (5); DataSource.SetIdleConnectionTestPeriod (60); 반환 데이터 소스; }}데이터베이스 디자인, 데이터베이스에는 하나의 사람 테이블이 있으며 디자인은 다음과 같습니다.
3. JPA 구성
Spring-Data-JPA 구성 파일은 다음과 같습니다.
package com.us.example.config; import java.util.hashmap; import java.util.map; import javax.persistence.entityManagerFactory; import javax.sql.datasource; import org.spramframework.beans.bean.annotation.autowired; import org.spramean; org.springframework.context.annotation.configuration; import org.springframework.data.jpa.repository.config.enablejparepositories; import org.springframework.orm.jpa.jpatransactionManager; import org.springframework.orm.jpa.localcalcalcalconerengetortorybean; org.springframework.orm.jpa.vendor.hibernatejpavendoradapter; import org.springframework.transaction.platformtransactionManager; import org.springframework.transaction.annotation.enabletransactionManagement;/*** 17/1/13에서 Yangyibo에 의해 생성되었습니다. */@configuration@enablejparepositories ( "com.us.example.dao")@enableTransactionManagement@componentscanpublic class jpaconfig {@autowired private dataSource dataSource; @Bean Public EntityManagerFactory EntityManagerFactory () {HibernateJPavenDorAdapter VendorAdapter = New HibernatejpavendorAdapter (); LocalContainerEntityManagerFactoryBean Factory = 새로운 LocalContainerentityManagerFactoryBean (); Factory.setjpavendoradapter (VendorAdapter); factory.setpackagestoscan ( "com.us.example.bean"); Factory.SetDatasource (DataSource); Map <string, object> jpaproperties = new Hashmap <> (); jpaproperties.put ( "hibernate.ejb.naming_strategy", "org.hibernate.cfg.improvednamingstrategy"); jpaproperties.put ( "hibernate.jdbc.batch_size", 50); Factory.setjpapropertymap (jpaproperties); Factory.fterProperTiesset (); return factory.getObject (); } @Bean public platformtransactionManager transactionManager () {jpatransactionManager txManager = new JPatrAnsactionManager (); txmanager.setentityManagerFactory (entityManagerFactory ()); TXManager를 반환합니다. }}4. 콩과 DAO 층을 쓰십시오
Entity Class Person.java
package com.us.example.bean; import javax.persistence.entity; import javax.persistence.generatevalue; import javax.persistence.id; import javax.persistence.table;/*** 17/1/13에서 생성. */ @entity @table (name = "person") 공개 클래스 사람 {@id @generatedvalue private long id; 개인 문자열 이름; 개인 정수 시대; 개인 문자열 주소; 공개 사람 () {super (); } public Person (긴 ID, 문자열 이름, 정수 연령, 문자열 주소) {super (); this.id = id; this.name = 이름; this.age = age; address = 주소; } public long getId () {return id; } public void setId (long id) {this.id = id; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public integer getage () {return age; } public void setage (정수 시대) {this.age = age; } public String getAddress () {return address; } public void setAddress (문자열 주소) {this.address = 주소; }}Dao 레이어, Personrepository.java
package com.us.example.dao; import com.us.example.bean.person; import org.springframework.data.jpa.repository.jparepository;/*** 17/1/13에 Yangyibo에 의해 생성되었습니다. */public interface personrepository 확장 jparepository <person, long> {}5. 서비스 계층을 작성하십시오
서비스 인터페이스
package com.us.example.service; import com.us.example.bean.person;/*** Yangyibo가 17/1/13에 만들었습니다. */public interface demoservice {public persave save (person); 공개 무효 제거 (긴 ID); 공공 사람 findone (사람);}구현 : (키, 여기에 캐시 추가)
package com.us.example.service.Impl;import com.us.example.bean.Person;import com.us.example.dao.PersonRepository;import com.us.example.service.DemoService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.cacheput; import org.springframework.cache.annotation.cachable; import org.spramframework.stereotyp.service;/*** 17/1/13에 Yangyibo에 의해 생성. */ @servicepublic 클래스 DemoserviceImpl은 Demoservice를 구현합니다. @override //@Cacheput는 캐시 이름이 사람인 캐시에 새로 추가되거나 업데이트 된 데이터를 캐시합니다. 데이터의 열쇠는 사람의 ID @cacheput (value = "people", key = "#person.id") 공개 사람 저장 (개인) {person p = personrepository.save (person); System.out.println ( "ID의 경우 키는 다음과 같습니다."+p.getId ()+"Data Cached"); 반환 p; } @override // @cacheevict cache people @cacheevict (value = "people") public void remove (long id) {system.out.println ( "ID 및 키"+id+"로 데이터 캐시를 삭제 함)} @OverRRIDE // @CACHEOL의 데이터를 사용하지 않습니다. 메소드 매개 변수는 @cachable에 저장됩니다.6. 컨트롤러를 쓰십시오
테스트의 편의를 위해 GET가 사용됩니다
package com.us.example.controller; import com.us.example.bean.bean.person; import com.us.example.service.demoservice; import org.spramframework.bean.beans.annotation.autowired; import org.spramework.stereotyp.stereotyp.controller org.springframework.web.bind.annotation.responsebody; import org.springframework.web.bind.annotation.restcontroller;/*** 17/1/13에 Yangyibo에 의해 생성되었습니다. */ @restControllerPublic Class CacheController {@autowired private demoservice demoservice; // http : // localhost : 8080/put? name = abel & age = 23 & address = shanghai @requestmapping ( "/put") public person put (person) {return demoservice.save (person); } // http : // localhost : 8080/able? id = 1 @requestmapping ( "/able") @ResponseBody Public Person Cachable (Person Person) {return demoservice.findone (person); } // http : // localhost : 8080/evit? id = 1 @requestmapping ( "/evit") public String evit (long id) {demoservice.remove (id); "OK"를 반환합니다. }}7. 캐시를 시작하십시오
시작 클래스에서 캐시 구성을 활성화해야합니다.
패키지 com.us.example; import org.springframework.boot.autoconfigure.springbootApplication; import org.springframework.cache.annotation.enablecaching; import org.springframework.context.context.configurableApplicationcontext; import org.springfrfframework.contetat.com.annottic org.springframework.boot.springApplication.*;/*** Yangyibo가 17/1/13에 생성했습니다. */@componentsCan (basePackages = "com.us.example")@springbootApplication@enableCachingPublic 클래스 응용 프로그램 {public static void main (String [] args) {configurableApplicationContext run = run (applact.class, args); }}8. 검증 및 검증 능력 테스트 :
애플리케이션 클래스를 시작하고 시작한 후 시작 후 http : // localhost : 8080/able? id = 1을 브라우저에서 입력하십시오 (먼저 데이터베이스의 여러 데이터를 초기화합니다.)
콘솔 출력 :
"ID와 키의 데이터는 다음과 같습니다. 1"은이 쿼리를 위해 캐시되었습니다. 데이터를 다시 쿼리하면이 명령문이 나타나지 않습니다. 즉, 데이터베이스는 쿼리되지 않습니다.
검사 풋
브라우저를 입력하십시오 : http : // localhost : 8080/put? name = abel & age = 23 & address = shanghai (데이터베이스에 데이터를 삽입하고 데이터를 캐시에 넣습니다.)
현재 콘솔 출력은 레코드를 캐시합니다.
그런 다음 유능한 메소드를 다시 호출하여 데이터를 쿼리하십시오. 데이터베이스는 더 이상 쿼리되지 않으며 데이터는 캐시에서 직접 읽습니다.
테스트 EVIT
입력 : http : // localhost : 8080/evit? id = 1 브라우저에서 (캐시에서 레코드를 지우십시오. 클리어를 지은 후 레코드에 액세스 한 후 레코드가 다시 캐시에 넣습니다.)
콘솔 출력 :
스위치 캐시
1. 캐시로 Ehcache로 전환하십시오
pom.xml 파일에 종속성을 추가하십시오
<pectionency> <groupid> net.sf.ehcache </groupid> <artifactid> ehcache </artifactid> </fectionency>
자원 폴더에서 구성 파일 ehcache.xml을 만듭니다. 새 EHCACH 구성 파일의 내용은 다음과 같습니다. 이 파일 스프링 부팅은 자동으로 스캔됩니다
<? xml version = "1.0"encoding = "utf-8"?> <ehcache> <!-Ehcache 캐시로 전환 할 때 사용-> <cache name = "people"maxelementsInmemory = "1000" /> < /ehcache>
2. 캐시로 구아바로 전환하십시오
POM에 종속성을 추가하십시오
<pectionency> <groupid> com.google.guava </groupid> <artifactid> guava </artifactid> <bersion> 18.0 </version> </fectionency>
3. 캐시로 Redis로 전환하십시오
다음 블로그를 읽으십시오
이 기사에 대한 참조 : "Javaee Development의 중단기 : Spring Boot Explication Battle"
이 기사의 소스 코드 : https://github.com/527515025/springboot.git
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.