使用Hazelcast作為Spring資料儲存庫的開源案例
在我們的付款系統中,使用了非常簡單的快取方式。我們有本地的EhCache,它工作得很好,是在JDBC層提供的。這種設計的缺點是:
- 這是本地快取。沒有資料更改傳播到其他節點。
- 不涉及JPA。
解決上述問題的好方法是將Hazelcast包裝到Spring Data API中, 稱為spring-data-hazelcast
在該儲存庫中,我將向您展示如何使用H2資料庫支援的Hazelcast Spring Data API 構建完整的只讀快取。
首先,一定要看一下spring-data-jpa-hazelcast-migration 如果您是Spring Data JPA新手,那麼本指南將非常有幫助。然後確保您熟悉Hazelcast MapLoader。
使用HazelcastRead-through快取
- maven依賴
<properties> <java.version>1.8</java.version> <spring-data-hazelcast-version>2.2.5</spring-data-hazelcast-version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.hazelcast</groupId> <artifactId>spring-data-hazelcast</artifactId> <version>${spring-data-hazelcast-version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> |
spring-data-hazelcast外掛已經打包好了hazelcast,因此無需擔心版本問題。大讚!
- 第二步
快取實體是儲存在H2資料庫,並透過MapLoader提供給hazelcast的,該實體是此read-through體系結構的引擎:
@KeySpace("persons") @Entity @Table(name = "persons") public class Person implements Serializable { @Id @javax.persistence.Id private Long personId; private String name; private String surname; private String role; private Long teamId; @Column(name = "PERSON_ID") public Long getPersonId() { return personId; } public void setPersonId(Long personId) { this.personId = personId; } @Column(name = "NAME") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name = "SURNAME") public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } @Column(name = "ROLE") public String getRole() { return role; } public void setRole(String role) { this.role = role; } @Column(name = "TEAM_ID") public Long getTeamId() { return teamId; } public void setTeamId(Long teamId) { this.teamId = teamId; } |
此處的KeySpace註釋表示,hazelcast 將使用名為“persons”的IMap將資料儲存在記憶體中。
- 第三步
MapLoader實現將資料庫和Hazelcast粘合在一起:
@Component public class HazelcastMapStore implements ApplicationContextAware, MapLoader<Long, Person> { private static PersonsJPARepository personsJPARepository; @Override public Person load(Long personId) { System.out.println("Loading by key: "+personId); return personsJPARepository.findById(personId).get(); } @Override public Map<Long, Person> loadAll(Collection<Long> collection) { System.out.println("Loading collections of IDS: "); Map<Long, Person> result = new HashMap<>(); for (Long key : collection) { Person productMap = this.load(key); if (productMap != null) { result.put(key, productMap); } } return result; } @Override public Iterable<Long> loadAllKeys() { System.out.println("Getting all the keys!"); return personsJPARepository.findAllId(); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { personsJPARepository = applicationContext.getBean(PersonsJPARepository.class); } |
MapLoader已準備就緒,現在每次當請求的實體不在記憶體中時,Hazelcast都會命中MapLoader.load(personId)其他兩種方法只是預熱快取方法,用於在第一次快取命中之前載入快取的資料。
- 第四步
建立"persons" IMap,並連線到已經建立的HazelcastMapStore。
@Configuration public class HazelcastConfiguration { @Bean public Config hazelcastConfig(@Lazy HazelcastMapStore mapStore) { return new Config().setInstanceName("hazelcast-instance").addMapConfig( new MapConfig().setName("persons") .setMapStoreConfig( new MapStoreConfig().setEnabled(true).setInitialLoadMode(MapStoreConfig.InitialLoadMode.EAGER) .setImplementation(mapStore) )); } @Bean public HazelcastInstance hazelcastInstance(Config config) { return Hazelcast.newHazelcastInstance(config); } |
如果在將您的儲存庫連線到MapLoader時遇到問題,請檢視此 Stackoverflow討論
- 第五步
配置用於Hazelcast(快取)和JPA(訪問H2 DB)的Spring資料儲存庫
@SpringBootApplication(exclude = { HazelcastAutoConfiguration.class }) @EnableHazelcastRepositories(basePackages={"com.example.hazelcast.demo.repositories.hz"}) @EnableJpaRepositories(basePackages={"com.example.hazelcast.demo.repositories.jpa"}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } |
EnableHazelcastRepositories,EnableJpaRepositories只是說明Spring資料儲存庫的位置。
這是完整的程式碼:
package com.example.hazelcast.demo.repositories.hz; import com.example.hazelcast.demo.model.Person; import org.springframework.data.hazelcast.repository.HazelcastRepository; public interface PersonsHazelcastRepository extends HazelcastRepository<Person, Long> { Person findPersonByPersonId(Long personId); } package com.example.hazelcast.demo.repositories.jpa; import com.example.hazelcast.demo.model.Person; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; public interface PersonsJPARepository extends CrudRepository<Person, Long> { @Query("SELECT n.id FROM Person n") Iterable<Long> findAllId(); } |
相關文章
- 給資料庫新增儲存空間的案例資料庫
- 使用data.js作為統一的資料儲存中心JS
- 使用Room持久庫儲存資料OOM
- Spring整合Quartz案例使用RAM儲存方式Springquartz
- Spring整合Quartz案例使用JDBC儲存方式SpringquartzJDBC
- 使用資料庫儲存session的方法 (轉)資料庫Session
- 儲存多路徑故障導致資料庫死掉案例資料庫
- 使用PostgreSQL作為資料倉儲 - narratorSQL
- Laravel 使用 Elasticsearch 作為日誌儲存LaravelElasticsearch
- 使用NFS作為Glance儲存後端NFS後端
- 層次結構資料的資料庫儲存和使用資料庫
- 為什麼不用資料庫儲存圖片?資料庫
- 列式儲存資料庫資料庫
- 為遺留使用者儲存庫開發聯合儲存庫的定製介面卡
- 【儲存資料恢復】NetApp儲存誤刪資料夾的資料恢復案例資料恢復APP
- 去中心化大資料儲存的開源方案:Storj中心化大資料
- MySQL資料庫MyISAM儲存引擎轉為Innodb的方法MySql資料庫儲存引擎
- 【融雲分析】從過剩儲存資源到分散式時序資料庫的長儲存分散式資料庫
- VSAN儲存結構解析+儲存資料恢復案例資料恢復
- 【儲存資料恢復】HP EVA儲存誤刪除VDISK的資料恢復案例資料恢復
- 【儲存資料恢復】EqualLogic PS系列儲存磁碟故障的資料恢復案例資料恢復
- 【儲存資料恢復】NetApp儲存誤刪除的資料恢復案例資料恢復APP
- Flutter持久化儲存之資料庫儲存Flutter持久化資料庫
- 使用儲存過程(PL/SQL)向資料庫中儲存BLOB物件儲存過程SQL資料庫物件
- 【儲存資料恢復】esx vmfs的互斥導致儲存資料丟失的資料恢復案例資料恢復
- k8s使用rbd作為儲存K8S
- 使用Hazelcast排程Spring tasksASTSpring
- 【資料庫】資料庫儲存過程(一)資料庫儲存過程
- 使用自動儲存管理 (ASM)建立資料庫ASM資料庫
- 資料庫開發---常用物件-儲存過程資料庫物件儲存過程
- MySQL 資料庫儲存引擎MySql資料庫儲存引擎
- 資料庫儲存過程資料庫儲存過程
- 大資料元件-Hive部署基於MySQL作為後設資料儲存大資料元件HiveMySql
- 【伺服器儲存資料恢復】HP-Lefthand儲存資料恢復案例伺服器資料恢復
- 使用spring validation 作為資料校驗Spring
- Spring Boot實戰系列(2)資料儲存之NoSQL資料庫MongoDBSpring BootSQL資料庫MongoDB
- MySQL資料庫的儲存引擎(轉)MySql資料庫儲存引擎
- 使用Spring Boot實現資料庫整合配置案例Spring Boot資料庫