導入
私たちの知識は、プログラムのボトルネックがデータベースにあることであり、私たちの知識は、メモリの速度がハードディスクの速度よりもはるかに高速であることも知っています。部門が同じデータを繰り返し取得する必要がある場合、部門はデータベースまたはリモートサービスを何度も何度もリクエストし、データベースクエリまたはリモートメソッド呼び出しに多くの時間を費やし、プログラムのパフォーマンスが劣化します。
春のキャッシングサポート
Springは、org.springframework.cache.cachemanager and org.springframework.cache.cacheインターフェイスを定義して、さまざまなキャッシュテクノロジーを統合します。その中で、CacheManagerは、Springが提供するさまざまなキャッシュテクノロジーの抽象的なインターフェイスです。キャッシュインターフェイスにはさまざまなキャッシュ操作が含まれます(キャッシュを取得するための追加と削除、当社のシステムは通常、このインターフェイスを直接処理しません)
春にサポートされているキャッシュマネージャー
さまざまなキャッシュテクノロジーの場合、さまざまなキャッシュマネージャーを実装する必要があります。 Springは、次の表にCacheManagerの実装を定義します。
CacheManagerを実装するときは、CacheManagerを実装するBeanを登録する必要があります。もちろん、各キャッシュテクノロジーには多くの追加の構成がありますが、CacheManagerの構成が不可欠です。
宣言キャッシュ注釈
Springは、表に示すように、キャッシュルール(注釈付き式を使用したAOPの鮮明な例)を宣言する4つの注釈を提供します。
宣言的なキャッシュをオンにします
宣言的なキャッシュサポートをオンにするのは非常に簡単です。構成クラスで@EnabelCachingアノテーションを使用するだけです。
スプリングブートのサポート
春の中国でキャッシュテクノロジーを使用する鍵は、CacheManagerを構成することです。 Springbokは、ドア用の複数のCacheManager実装を自動的に構成します。 Spring Boot環境では、キャッシュテクノロジーを使用するには、プロジェクトに関連するキャッシュテクノロジーの依存関係パッケージをインポートし、 @EnabelCachingを使用してキャッシュサポートを有効にするためにクラスを構成する必要があります。
小さな例
Springboot+JPa+キャッシュを使用して小さな例が実装されています。
例のステップディレクトリ
1. Mavenプロジェクトを作成します
次のように、新しいMavenプロジェクト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 <http://www.w3.org/2001 xsi:schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.0.sdsd"> <modelversion> 4.0.0 </modelversion> <グループ<バージョン> 1.0-snapshot </version> <parent> <parent> groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <バージョン> 1.3.0.release </version> </parent> <properties> <start-class> <maven.compiler.target> 1.8 </maven.compiler.target> <maven.compiler.source> 1.8 </maven.compiler.source> </properties> <! - Webアプリケーションの典型的な依存関係を追加 - > <依存関係> < <artifactid> spring-boot-starter-cache </artifactid> </dependency> <dependency> org.springframework.boot </groupid> <artifactid> spring-boot-starter-jpa </artifactid> </dependency> <shentency> <artifactid> spring-boot-starter-web </artifactid> </dependency> <dependency> groupid> net.sf.ehcache </groupid> <artifactid> ehcache </artifactid> </dependency> <! - db-> <dendectency> <groupid> </groupid> <artifactid> mysql-connector-java </artifactid> <version> 6.0.5 </version> </dependency> <dependency> <groupid> com.mchange </groupid> <artifactid> c3p0 <artifactid> commons-logging </artifactid> </exclusion> </explusions> </dependency> </dependencies> </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&charatereCoding = utf-8&usessl = false&approwmultiqueries = truems.db.username = rootms.db.password = xxxxxxms.db.maxactive = 500
新しいdbconfig.java構成ファイルを作成し、データソースを構成する
パッケージcom.us.example.config;/*** Yangyiboが17/1/13に作成しました。 */import java.beans.propertyvetoexception; Import org.springframework.beans.factory.annotation.autowired; Import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; importringframment; com.mchange.v2.c3p0.combopooleddatasource; @configurationpublic class dbconfig {@autowired private環境env; @bean(name = "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); DataSourceを返します。 }}データベース設計では、データベースには1人の人のテーブルのみがあり、デザインは次のとおりです。
3.JPA構成
Spring-Data-JPA構成ファイルは次のとおりです。
パッケージcom.us.example.config; Import java.util.hashmap; Import java.util.map; import javax.persist.entitymanagerfactory; import javax.sql.datasource; Import org.springframework.beans.factory.annotation.antowired; org.springframework.context.annotation.configuration; Import org.springframework.data.jpa.repository.config.enablejparepositories; Import org.springframework.orm.jpa.jpatransactionmanager; Import org.springframework.orm.jpa.localcontainerentitymanagerfactorybean; Import org.springframework.orm.jpa.vendor.hibernatejpavendoradapter; Import org.springframework.transaction.platformtransactionmanager; Import org.springframework.transaction.annotation.EnabletransactionManagement;/*** Yangyiboが17/1/13に作成しました。 */@configuration@enablejparepositories( "com.us.example.dao")@enabletransactionmanagement@componentscanpublic class jpaconfig {@autowired private dataSource dataSource; @Bean Public ManagerFactory EntityManagerFactory(){hibernateJPavendoradapter vendoradapter = new hibernateJpavendoradapter(); localcontainerentitymanagerfactorybean factory = new 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.afterPropertiesset(); return factory.getobject(); } @bean public PlatformTransactionManager TransactionManager(){jpatransactionManager txmanager = new jpatransactionManager(); txmanager.setEntityManagerFactory(EntityManagerFactory()); txmanagerを返します。 }}4。豆とdaoの層を書きます
Entity Class Person.java
パッケージcom.us.example.bean; import javax.persistence.entity; import javax.persistence.generatedValue; import javax.persistence.id; import javax.persistence.table;/*** yangyiboが17/1/13に作成しました。 */ @entity @table(name = "person")public class person {@id @generatedValue private long id;プライベート文字列名;民間整数年齢;プライベート文字列アドレス。 public Person(){super(); } public Person(long id、string name、integer age、string dresder){super(); this.id = id; this.name = name; this.age = age; this.address = address; } public long getId(){return id; } public void setid(long id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; } public Integer getage(){return age; } public void Setage(整数年齢){this.age = age; } public string getAddress(){return Address; } public void setAddress(stringアドレス){this.address = address; }}dao layer、personrepository.java
パッケージcom.us.example.dao; Import com.us.example.bean.person; Import org.springframework.data.jpa.repository.jparepository;/*** Yangyiboが17/1/13に作成しました。 */public interface personrepositoryはjparepository <person、long> {}を拡張します5。サービスレイヤーを書きます
サービスインターフェイス
パッケージcom.us.example.service; Import com.us.example.bean.person;/*** Yangyiboが17/1/13に作成しました。 */public interface demoservice {public person save(person person); public void remove(long id);パブリックパーソンfindone(人の人);}実装:(キー、ここにキャッシュを追加)
パッケージcom.us.example.service.impl; import com.us.example.bean.person; Import com.us.us.example.dao.personRepository; Import com.us.us.example.service.demoservice; Import org.springframework.beans.factory.annotation.Autowired; Artring.springframework.annot.annot.Annot.Annot.Annotation org.springframework.cache.annotation.cacheput; Import org.springframework.cache.annotation.cachable; import org.springframework.stereotype.service;/*** Yangyiboが17/1/13に作成しました。 */ @ServicePublic Class DemoserviceImplはDemoservice {@Autowired Private PersonRepository PersonRepositoryを実装しています。 @Override //@cacheputキャッシュは、キャッシュ名が人であるキャッシュにデータを新たに追加または更新しました。データのキーは、person @cacheput(value = "people"、key = "#person.id")public person save(person person){person p = personrepository.save(person); system.out.println( "idの場合、キーは"+p.getid()+"data cached"); pを返します。 } @Override //@CacheEvict Remove data with key id from cache people @CacheEvict(value = "people") public void remove(Long id) { System.out.println("Deleted the data cache with id and key "+id+"); //The actual deletion operation is not performed here} @Override //@Cacheable caches the id data with the key person in the cache people. If no key is指定されたメソッドパラメーターは、 @キャッチ可能なものとしてキャッシュを保存します。6。コントローラーを書き込みます
テストの便利さのために、GETが使用されます
パッケージcom.us.example.controller; Import com.us.example.bean.person; Import com.us.example.service.demoservice; Import org.springframework.beans.factory.annotation.autowired; Import org.springframework.stereoty.controller; import; org.springframework.web.bind.annotation.requestmapping; Import org.springframework.web.bind.annotation.responsebody; Import org.springframework.web.bind.annotation.restcontroller;/*** Yangyiboによって17/1/13で作成されました。 */ @retscontrollerpublic class cachecontroller {@autowired private demoservice demoservice; // http:// localhost:8080/put?name = abel&age = 23&address = shanghai @requestmapping( "/put")public person put(person person){return demoservice.save(person); } // http:// localhost:8080/able?id = 1 @requestmapping( "/able")@responsebody public perune public peruns 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.configureableapplicatextext org.springframework.boot.springApplication。*;/*** 17/1/13にYangyiboによって作成されました。 */@componentscan(basepackages = "com.us.example")@springbootapplication@enablecachingpublic class application {public static void main(string [] args){configureableapplicationContext run = run(application.class、args); }}8。テスト検証と検証能力:
アプリケーションクラスを開始し、開始後、http:// localhost:8080/able?id = 1ブラウザに入力します(最初にデータベースのいくつかのデータを初期化します。)
コンソール出力:
「IDとキーのデータは次のとおりです。1」は、このクエリのためにキャッシュされています。データを再度照会すると、このステートメントは表示されません。つまり、データベースは照会されません。
検査プット
ブラウザに入力します:http:// localhost:8080/put?name = abel&age = 23&address = shanghai(データベースにデータを挿入してキャッシュにデータを入れます。)
この時点で、コンソール出力はレコードをキャッシュします。
次に、ABLEメソッドを再度呼び出してデータを照会します。データベースは照会されなくなり、データはキャッシュから直接読み取られます。
テストevit
入力:http:// localhost:8080/evit?id = 1ブラウザで(キャッシュからレコードをクリアします。クリアした後、レコードにアクセスした後、レコードが再びキャッシュに入れられます)。
コンソール出力:
キャッシュを切り替えます
1.キャッシュとしてehcacheに切り替えます
pom.xmlファイルに依存関係を追加します
<依存関係> <groupId> net.sf.ehcache </groupid> <artifactid> ehcache </artifactid> </dependency>
リソースフォルダーに構成ファイルehcache.xmlを作成します。新しいehcache構成ファイルの内容は次のとおりです。このファイルスプリングブートは自動的にスキャンされます
<?xml version = "1.0" encoding = "utf-8"?> <ehcache> <! - ehcacheキャッシュに切り替えるときに使用 - > <キャッシュname = "人" maxelementsinmemory = "1000" /> < /ehcache> < /ehcache>
2.キャッシュとしてGuavaに切り替えます
POMに依存関係を追加するだけです
<Dependency> GroupId> com.google.guava </groupId> <ArtifActid> guava </artifactid> <バージョン> 18.0 </version> </dependency>
3.キャッシュとしてRedisに切り替えます
次のブログを読んでください
この記事のリファレンス:「Javaee開発の破壊者:Spring Boot Practical Battle」
この記事のソースコード:https://github.com/527515025/springboot.git
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。