使用Spring Data的Apache Ignite

Spring Data提供了一种统一而简单的方法来访问不同类型的持久性存储,关系数据库系统和NoSQL数据存储。 它位于JPA之上,添加了另一层抽象并定义了基于标准的设计以在Spring上下文中支持持久层。

Apache Ignite IgniteRepository实现了Spring Data CrudRepository接口并扩展了CrudRepository的基本功能,该功能又支持:

  1. 特定类型存储库上的基本CRUD操作。
  2. 通过Spring Data API访问Apache Ignite SQL网格。

使用Spring Data的存储库,您只需要编写一个带有finder方法的接口来查询对象。 用于处理对象的所有CRUD方法将自动提供。 举个例子:

@RepositoryConfig(cacheName = "DogCache")
public interface DogRepository extends IgniteRepository<Dog, Long> {List<Dog> getDogByName(String name);Dog getDogById (Long id);
}

在本文中,我们将介绍以下主题:

  • 从头开始创建一个Maven项目,以将Spring Data与Apache Ignite Grid一起使用。
  • 通过Spring Data框架将一些实体持久保存到Ignite缓存中。

在开始之前,让我们在沙盒中介绍项目的先决条件:

  1. Java JDK 1.8
  2. 点燃2.0版
  3. Apache Maven版本> 3.0.3

步骤1

让我们先设置沙箱。 创建一个Maven项目或从GitHub存储库克隆该项目。

mvn archetype:create -DgroupId=com.blu.imdg -DartifactId=spring-data

修改pom.xml,添加以下Maven依赖项:

<dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-core</artifactId><version>2.0.0</version>
</dependency>
<dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-spring</artifactId><version>2.0.0</version>
</dependency>
<dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-spring-data</artifactId><version>2.0.0</version>
</dependency>
<dependency><groupId>org.apache.ignite</groupId><artifactId>ignite-indexing</artifactId><version>2.0.0</version>
</dependency>
<dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>1.4.195</version>
</dependency>

注意,maven h2依赖关系是可选的。 如果遇到类似“ org.h2.result.RowFactory”的错误,请显式添加依赖项。

我们的示例域模型由两个不同的实体组成:Breed和Dog。

品种和狗之间的关联是ManyToOne 。 一只狗只能有一个品种。

现在,让我们通过创建Java类并用所需的元信息注释它们来映射域模型。 让我们从Breed类开始。

package com.blu.imdg.model;import org.apache.ignite.cache.query.annotations.QuerySqlField;import java.io.Serializable;public class Breed implements Serializable {@QuerySqlField(index = true)private Long id;@QuerySqlField(index = true)private String name;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;}@Overridepublic String toString() {return "Breed{" +"id='" + id + '\'' +", name='" + name + '\'' +'}';}
}

请注意,@ QuerySqlField批注启用用于SQL查询的字段。

创建另一个名为Dog的类,并向其中添加以下内容。

package com.blu.imdg.model;import org.apache.ignite.cache.query.annotations.QuerySqlField;import java.io.Serializable;
import java.sql.Date;public class Dog implements Serializable {@QuerySqlField(index = true)private Long id;@QuerySqlField(index = true)private String name;@QuerySqlField(index = true)private Long breedid;@QuerySqlField(index = true)private Date birthdate;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 Long getBreedid() {return breedid;}public void setBreedid(Long breedid) {this.breedid = breedid;}public Date getBirthdate() {return birthdate;}public void setBirthdate(Date birthdate) {this.birthdate = birthdate;}@Overridepublic String toString() {return "Dog{" +"id=" + id +", name='" + name + '\'' +", breedid=" + breedid +", birthdate=" + birthdate +'}';}
}

现在,让我们为之前创建的所有pojo创建Spring存储库。

package com.blu.imdg.repositories;import com.blu.imdg.model.Dog;
import org.apache.ignite.springdata.repository.IgniteRepository;
import org.apache.ignite.springdata.repository.config.RepositoryConfig;import java.util.List;@RepositoryConfig(cacheName = "DogCache")
public interface DogRepository extends IgniteRepository<Dog, Long> {List<Dog> getDogByName(String name);Dog getDogById (Long id);
}

应该指定@RepositoryConfig批注以将存储库映射到分布式缓存。 另外,我们有两个查找器方法getDogByName和getDogById用于查询缓存。

让我们为Breed域添加一个类似的存储库,如下所示:

package com.blu.imdg.repositories;import com.blu.imdg.model.Breed;
import org.apache.ignite.springdata.repository.IgniteRepository;
import org.apache.ignite.springdata.repository.config.Query;
import org.apache.ignite.springdata.repository.config.RepositoryConfig;
import org.springframework.data.domain.Pageable;import java.util.List;@RepositoryConfig(cacheName = "BreedCache")
public interface BreedRepository extends IgniteRepository<Breed, Long> {List<Breed> getAllBreedsByName (String name);@Query("SELECT id FROM Breed WHERE id = ?")List<Long> getById (long id, Pageable pageable);
}

在上面的BreedRepository接口中,我们还使用@Query(queryString)批注,如果由于方法调用而需要执行具体的SQL查询,则可以使用该批注。

第5步

让我们创建缓存配置类。 创建一个Ignite缓存配置类,并使用@EnableIgniteRepositories批注标记应用程序配置,如下所示:

package com.blu.imdg.repositories;import com.blu.imdg.model.Breed;
import com.blu.imdg.model.Dog;
import org.apache.ignite.Ignite;
import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.springdata.repository.config.EnableIgniteRepositories;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableIgniteRepositories
public class SpringAppConfig {@Beanpublic Ignite igniteInstance() {IgniteConfiguration cfg = new IgniteConfiguration();// Setting some custom name for the node.cfg.setIgniteInstanceName("springDataNode");// Enabling peer-class loading feature.cfg.setPeerClassLoadingEnabled(true);// Defining and creating a new cache to be used by Ignite Spring Data// repository.CacheConfiguration ccfgDog = new CacheConfiguration("DogCache");CacheConfiguration ccfgBreed = new CacheConfiguration("BreedCache");// Setting SQL schema for the cache.ccfgBreed.setIndexedTypes(Long.class, Breed.class);ccfgDog.setIndexedTypes(Long.class, Dog.class);cfg.setCacheConfiguration(new CacheConfiguration[]{ccfgDog, ccfgBreed});return Ignition.start(cfg);}
}

请注意,我们为Breed和Dog缓存使用了两个单独的CacheConfiguration。 另外,设置缓存的SQL模式。

一旦准备好使用所有配置和存储库,我们只需要在Spring应用程序上下文中注册配置即可。

package com.blu.imdg;import com.blu.imdg.model.Breed;
import com.blu.imdg.model.Dog;
import com.blu.imdg.repositories.BreedRepository;
import com.blu.imdg.repositories.DogRepository;
import com.blu.imdg.repositories.SpringAppConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.sql.Date;
import java.util.List;/*** Hello world!**/
public class App 
{private static AnnotationConfigApplicationContext ctx;private static BreedRepository breedRepository;private static DogRepository dogRepository;public static void main( String[] args ){System.out.println( "Spring Data Example!" );ctx = new AnnotationConfigApplicationContext();ctx.register(SpringAppConfig.class);ctx.refresh();breedRepository = ctx.getBean(BreedRepository.class);dogRepository = ctx.getBean(DogRepository.class);//fill the repository with data and SaveBreed collie = new Breed();collie.setId(1L);collie.setName("collie");//save Breed with name colliebreedRepository.save(1L, collie);System.out.println("Add one breed in the repository!");// Query the breedList<Breed> getAllBreeds = breedRepository.getAllBreedsByName("collie");for(Breed breed : getAllBreeds){System.out.println("Breed:" + breed);}//Add some dogsDog dina = new Dog();dina.setName("dina");dina.setId(1L);dina.setBreedid(1L);dina.setBirthdate(new Date(System.currentTimeMillis()));//Save DinadogRepository.save(2L,dina);System.out.println("Dog dina save into the cache!");//Query the Dog DinaList<Dog> dogs = dogRepository.getDogByName("dina");for(Dog dog : dogs){System.out.println("Dog:"+ dog);}}
}

上面的代码片段非常简单。 首先,我们创建一个Spring注释的上下文并注册我们的存储库。 接下来,我们获得对BreedRepository和DogRepository的引用以插入一些数据。 要查询数据,我们使用基本的CRUD操作或方法,这些操作或方法将自动转换为Apache Ignite SQL查询:

List<Dog> dogs = dogRepository.getDogByName("dina");
for(Dog dog : dogs){System.out.println("Dog:"+ dog);
}

让我们构建并运行该应用程序。 执行以下命令。

mvn clean install
mvn exec:java -Dexec.mainClass=com.blu.imdg.App

您应该在控制台中找到许多日志消息。

日志消息确认两个条目(dina和colle-collie)已刷新到Ignite缓存中,并从缓存中检索了狗Dina 。 让我们通过Ignite Visor探索缓存。

为实体创建了两个不同的缓存:“品种”和“狗”。 如果我们扫描Dog缓存的缓存条目,则应在其上找到以下实体。

实体Dina已使用Breed牧羊犬的钥匙保存在缓存中。

如果要了解有关Apache Ignite的更多信息(使用JPA,Hibernate或MyBatis),请参阅《 使用Apache Ignite进行高性能内存计算 》一书。

翻译自: https://www.javacodegeeks.com/2017/07/apache-ignite-spring-data.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js hover图片放大不遮挡_CSS3+JS 实现放大镜

注意&#xff1a;看懂本文需要&#xff1a;懂中文 &#xff1a;)学习过 JavaScript 和 css代码较长&#xff0c;框框可左右滑动哦您的观看和点赞是对本公众号最大力的支持 ~~原文链接&#xff1a;https://blog.csdn.net/qq_43624878/article/details/110197749 CSS3JS完美实现放…

python装饰器class_Python中的各种装饰器详解

Python装饰器&#xff0c;分两部分&#xff0c;一是装饰器本身的定义&#xff0c;一是被装饰器对象的定义。 一、函数式装饰器&#xff1a;装饰器本身是一个函数。 1.装饰函数&#xff1a;被装饰对象是一个函数 [1]装饰器无参数&#xff1a; a.被装饰对象无参数&#xff1a; &g…

odoo controller 继承

方式一&#xff1a; 继承基类&#xff0c;直接重写方法 from odoo.addons.web.controllers.main import Exportclass PsExport(Export): http.route(/web/export/get_fields, typejson, auth"user") def get_fields(self, model, prefix, parent_name , import_co…

python字符串startswith_Python 字符串 startswith() 使用方法及示例

Python 字符串 startswith() 使用方法及示例如果字符串以指定的前缀(字符串)开头&#xff0c;则startswith()方法将返回True。如果不是&#xff0c;则返回False。startswith()的语法为&#xff1a;str.startswith(prefix[, start[, end]])startswith()参数startswith()方法最多…

odoo连接外部数据库

odoo框架默认的访问时Postgres数据库&#xff0c;但在实际的应用场景中&#xff0c;不可避免的使用到其他数据库&#xff0c;所以有必要研究如何连接其他第三方数据库&#xff0c;这里分享下OCA的相关模块&#xff0c;具体的源代码在这里。 我将第三方的数据库需要连接的情况汇…

整型和bcd的对应关系_微信与多闪之争背后,好友关系链到底是如何窃取的?

这几天从发布到全面推广&#xff0c;多闪已经快速的超越100万用户&#xff0c;迅速占领了appsotre榜首&#xff0c;在七麦数据中也是蝉联第一。但因多闪包括头条产品登录采取都支持【微信第三方登录】。很多用户都反馈是否自己的关系链被多闪、甚至是抖音窃取&#xff0c;并且腾…

线程同步,线程不同步_同步多线程集成测试

线程同步,线程不同步测试线程非常困难&#xff0c;这使得为被测多线程系统编写良好的集成测试非常困难。 这是因为在JUnit中&#xff0c;测试代码&#xff0c;被测对象和任何线程之间没有内置的同步。 这意味着&#xff0c;当您必须为创建并运行线程的方法编写测试时&#xff0…

ehcache 默认大小_简单的使用ehcache

ehcache是一个用Java实现的使用简单&#xff0c;高速&#xff0c;实现线程安全的缓存管理类库&#xff0c;ehcache提供了用内存&#xff0c;磁盘文件存储&#xff0c;以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目&#xff0c;采用限制比较宽松…

JS定时器使用,定时定点,固定时刻,循环执行

本文概述&#xff1a;本文主要介绍通过JS实现定时定点执行&#xff0c;在某一个固定时刻执行某个函数的方法。比如说在下一个整点执行&#xff0c;在每一个整点执行&#xff0c;每隔10分钟定时执行的方法。 JavaScript中有两个定时器方法&#xff1a;setTimeout&#xff08;&am…

axios 跨域_当遇到跨域开发时,我们如何处理好前后端配置和请求库封装

我们知道很多大型项目都或多或少的采用跨域的模式开发, 以达到服务和资源的解耦和高效利用. 在大前端盛行的今天更为如此, 前端工程师可以通过nodejs或者Nginx轻松搭建起web服务器.这个时候我们只需要请求后端服务器的接口即可实现系统的业务功能开发.这个过程中会涉及到web页面…

Java数据类型和标识符

在本教程中&#xff0c;我们将了解Java中的数据类型和标识符。 Java语言具有丰富的数据类型实现。 数据类型指定大小和可以存储在标识符中的值的类型。 Java数据类型分为两类&#xff1a; 原始数据类型 非原始数据类型 原始类型 Java定义了八种原始数据类型&#xff1a;字…

哈罗顺风车送到终点吗_没有了顺风车,滴滴“特惠拼车”来了!比拼车更低价,比顺风车更安全吗?...

近日&#xff0c;有网友表示&#xff0c;滴滴出行App内出现了“特惠拼车”功能&#xff0c;据悉&#xff0c;该功能主要给乘客提供长距离拼车出行的优惠折扣。如果拼车价格为44.8元&#xff0c;那“特惠拼车”的价格为30.7元。但是该功能目前还未在上海出现。近日&#xff0c;有…

管理角色认知-工程师到管理者角色发生了哪些变化?

背景 不同等级的管理者需求不同&#xff1b; 管理者需求说明新经理提供管理相关的工具和方法能力层面&#xff0c;术高级经理提升角色认知认知和理解&#xff0c;道&#xff0c;系统通过认知上的改变达到能力和行为上的改善一个人的行为&#xff0c;能力&#xff0c;价值观都源…

axure 小程序 lib_小程序定制开发的步骤有哪些?

经过两年多的微信小程序开发&#xff0c;各种功能应用变得越来越成熟&#xff0c;越来越多的企业和企业正在开发微信小程序用于在线营销。如果您的公司尚未开发成都小程序&#xff0c;它将变得越来越凶猛。在竞争激烈的市场环境中&#xff0c;将失去许多获得和营销客户的机会。…

java 检查打印机状态_爱普生打印机常见故障有哪些 爱普生打印机故障解决方法【详解】...

任何设备在使用一段时间后都会出现一些小问题&#xff0c;打印机也不例外&#xff0c;那么爱普生打印机常见的故障有哪些 &#xff0c;出现问题该怎么解决呢&#xff1f;下面小编就来分享2018爱普生打印机故障解决方法 &#xff0c;一起来看看吧&#xff01;一、故障现象 &a…

eureka 之前的服务如何关闭_干货分享 | 服务注册中心Spring Cloud Eureka部分源码分析...

友情提示&#xff1a;全文13000多文字&#xff0c;预计阅读时间10-15分钟Spring Cloud Eureka作为常用的服务注册中心&#xff0c;我们有必要去了解其内在实现机制&#xff0c;这样出现问题的时候我们可以快速去定位问题。当我们搭建好Eureka Server服务注册中心并启动后&#…

局部变量写在循环内还是外_循环内的局部变量和性能

局部变量写在循环内还是外总览 有时会出现一个问题&#xff0c;即分配一个新的局部变量需要多少工作。 我的感觉一直是&#xff0c;代码已优化到成本为静态的程度&#xff0c;即一次执行&#xff0c;而不是每次运行都执行一次。 最近&#xff0c; Ishwor Gurung建议考虑将一些…

csp-s模拟测试44「D·E·F」

用心出题,用脚造数据 乱搞场 1 #include<bits/stdc.h>2 #define re register3 #define int long long4 #define inf 0x7ffffffffffffff5 using namespace std;6 int n,a[100010],b[100010],ansinf;7 double st,ed;8 inline int read(){9 re int a0,b1; re char chget…

c++中的new_怎么在java中创建一个自定义的collector

简介在之前的java collectors文章里面&#xff0c;我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法&#xff0c;将结果转换为特定的集合类。今天我们介绍一下怎么自定义一个Collector。Collector介绍我们先看一下Collector的定义&#xff1a;Co…

Java 9中的新Regex功能

最近&#xff0c;我收到了Packt出版的Anubhava Srivastava提供的免费书籍“ Java 9 Regular Expressions” 。 这本书是一个很好的教程&#xff0c;它向任何想学习正则表达式并从头开始的人介绍。 那些知道如何使用正则表达式的人可能仍然很有趣&#xff0c;以重申其知识并加深…