只读副本和Spring Data第4部分:配置只读存储库

以前,我们在同一应用程序中设置了两个EntityManager。 一种用于读取,另一种用于写入。 现在是时候创建我们的读取存储库了。

只读存储库将使用辅助只读EntityManager。

为了使其成为只读存储库,至关重要的是不要执行任何保存和持久操作。

 package com.gkatzioura.springdatareadreplica.repository;  import java.util.List;  import org.springframework.data.repository.Repository;  import com.gkatzioura.springdatareadreplica.config.ReadOnlyRepository;  import com.gkatzioura.springdatareadreplica.entity.Employee;  /** * This is a read only repository */  public interface ReadEmployeeRepository extends Repository { List findAll();  } 

我们的下一个任务是使用读取数据库实体管理器创建此存储库。
这意味着除只读存储库外,所有存储库均应使用默认实体管理器创建。

我将首先创建一个注释。 此注释将声明我的存储库为只读。 另外,我将使用此批注进行扫描操作,以便使用适当的EntityManager。

 package com.gkatzioura.springdatareadreplica.config;  import java.lang.annotation.Documented;  import java.lang.annotation.ElementType;  import java.lang.annotation.Retention;  import java.lang.annotation.RetentionPolicy;  import java.lang.annotation.Target;  @Retention (RetentionPolicy.RUNTIME)  @Target ({ElementType.TYPE})  @Documented  public @interface ReadOnlyRepository {  } 

现在,我知道Spring Boot消除了对注释的需求,并以自动化的方式创建了存储库,但是我们的案例很特殊。

通过进行一些调整,我们的只读存储库将如下所示

 package com.gkatzioura.springdatareadreplica.repository;  import java.util.List;  import org.springframework.data.repository.Repository;  import com.gkatzioura.springdatareadreplica.config.ReadOnlyRepository;  import com.gkatzioura.springdatareadreplica.entity.Employee;  /** * This is a read only repository */  @ReadOnlyRepository  public interface ReadEmployeeRepository extends Repository { List findAll();  } 

现在是时候使用我们的存储库扫描了。 除使用@ReadOnlyRepository批注进行注释的存储库外,所有存储库均将注入主EntityManager。

 package com.gkatzioura.springdatareadreplica.config;  import javax.sql.DataSource;  import org.springframework.beans.factory.annotation.Qualifier;  import org.springframework.beans.factory.annotation.Value;  import org.springframework.boot.jdbc.DataSourceBuilder;  import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;  import org.springframework.context.annotation.Bean;  import org.springframework.context.annotation.ComponentScan;  import org.springframework.context.annotation.Configuration;  import org.springframework.context.annotation.Primary;  import org.springframework.data.jpa.repository.config.EnableJpaRepositories;  import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;  @Configuration  @EnableJpaRepositories ( basePackages = "com.gkatzioura" , excludeFilters = @ComponentScan .Filter(ReadOnlyRepository. class ), entityManagerFactoryRef = "entityManagerFactory"  )  public class PrimaryEntityManagerConfiguration { @Value ( "${spring.datasource.username}" ) private String username; @Value ( "${spring.datasource.password}" ) private String password; @Value ( "${spring.datasource.url}" ) private String url; @Bean @Primary public DataSource dataSource() throws Exception { return DataSourceBuilder.create() .url(url) .username(username) .password(password) .driverClassName( "org.postgresql.Driver" ) .build(); } @Bean @Primary public LocalContainerEntityManagerFactoryBean entityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier ( "dataSource" ) DataSource dataSource) { return builder.dataSource(dataSource) .packages( "com.gkatzioura.springdatareadreplica" ) .persistenceUnit( "main" ) .build(); }  } 

同样,我们将为只读存储库添加配置。

 package com.gkatzioura.springdatareadreplica.config;  import javax.sql.DataSource;  import org.springframework.beans.factory.annotation.Qualifier;  import org.springframework.beans.factory.annotation.Value;  import org.springframework.boot.jdbc.DataSourceBuilder;  import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;  import org.springframework.context.annotation.Bean;  import org.springframework.context.annotation.ComponentScan;  import org.springframework.context.annotation.Configuration;  import org.springframework.data.jpa.repository.config.EnableJpaRepositories;  import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;  @Configuration  @EnableJpaRepositories ( basePackages = "com.gkatzioura" , includeFilters= @ComponentScan .Filter(ReadOnlyRepository. class ), entityManagerFactoryRef = "readEntityManagerFactory"  )  public class ReadOnlyEntityManagerConfiguration { @Value ( "${spring.datasource.username}" ) private String username; @Value ( "${spring.datasource.password}" ) private String password; @Value ( "${spring.datasource.readUrl}" ) private String readUrl; @Bean public DataSource readDataSource() throws Exception { return DataSourceBuilder.create() .url(readUrl) .username(username) .password(password) .driverClassName( "org.postgresql.Driver" ) .build(); } @Bean public LocalContainerEntityManagerFactoryBean readEntityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier ( "readDataSource" ) DataSource dataSource) { return builder.dataSource(dataSource) .packages( "com.gkatzioura.springdatareadreplica" ) .persistenceUnit( "read" ) .build(); }  } 

辅助实体管理器将仅注入仅具有@ReadOnlyRepository批注的存储库。

为了说明这一点,让我们对控制器进行一些更改。

 package com.gkatzioura.springdatareadreplica.controller;  import java.util.List;  import org.springframework.http.HttpStatus;  import org.springframework.web.bind.annotation.GetMapping;  import org.springframework.web.bind.annotation.PostMapping;  import org.springframework.web.bind.annotation.RequestBody;  import org.springframework.web.bind.annotation.ResponseStatus;  import org.springframework.web.bind.annotation.RestController;  import com.gkatzioura.springdatareadreplica.entity.Employee;  import com.gkatzioura.springdatareadreplica.repository.EmployeeRepository;  import com.gkatzioura.springdatareadreplica.repository.ReadEmployeeRepository;  @RestController  public class EmployeeContoller { private final EmployeeRepository employeeRepository; private final ReadEmployeeRepository readEmployeeRepository; public EmployeeContoller(EmployeeRepository employeeRepository, ReadEmployeeRepository readEmployeeRepository) { this .employeeRepository = employeeRepository; this .readEmployeeRepository = readEmployeeRepository; } @GetMapping ( "/employee" ) public List getEmployees() { return employeeRepository.findAll(); } @GetMapping ( "/employee/read" ) public List getEmployeesRead() { return readEmployeeRepository.findAll(); } @PostMapping ( "/employee" ) @ResponseStatus (HttpStatus.CREATED) @ResponseStatus (HttpStatus.CREATED) public void addEmployee( @RequestBody Employee employee) { employeeRepository.save(employee); }  } 

当您将员工添加到系统时,只读存储库将继续获取旧员工,而主存储库将获取所有员工,包括最近保留的员工。

翻译自: https://www.javacodegeeks.com/2019/10/read-replicas-and-spring-data-configuring-the-read-repository.html

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

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

相关文章

c++中 int, long long, double 等数据类型的长度及范围整理

先附上一个比较直观的表,长度表示字节: byte: 字节 bit: 位 1. 短整型short: 所占内存大小:2byte16bit; 所能表示范围:-32768~32767;(即-2^15~2^15-1) 2. 整型int: 所占内存大小:4…

1044 火星数字 PAT乙级 (C++)

题目 火星人是以 13 进制计数的: 地球人的 0 被火星人称为 tret。地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。火星人将进位以后的 12 个高位数字分别称为:tam, hel, maa, huh, tou, …

怎样编写测试类测试分支_编写干净的测试–从配置开始

怎样编写测试类测试分支很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义。 但是,有一个似乎是通用的定义: 简洁的代码易于阅读。 这可能会让您感到有些惊讶,但我认为该定义也适用于测试代码。 使测试…

python 数据处理----读取txt 一列数据写入excel 文件

将txt数据从某一行开始写入excel文件中(例子为从Appthroughput写至excel_result1.xlsx中) import sys import random import time import xlwt import codecsdef Txt_to_Excel(wb,inputTxt,start_row,start_col):fr codecs.open(inputTxt,r)line_numbe…

CCF CSP 201403-1 相反数(C++)

题目 问题描述 有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。 输入格式 第一行包含一个正整数 N。(1 ≤ N ≤ 500)。   第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。 输出…

硒等待:内隐,外显,流利和睡眠

Selenium等待页面加载在Selenium脚本中起着重要的作用。 它们有助于使它们不易剥落,更可靠。 Selenium提供多次等待,以根据某些条件在脚本执行中提供足够的等待或暂停。 从而确保您在使用Selenium执行自动化测试时不会导致脚本失败。 在本教程中&#xf…

python多个变量的for循环

当for循环有两个需要迭代的对象时,要用zip对这多个变量封装,否则会报错“too many values to unpack” 错误的例子: starts [0,1,2,3,4]ends [5,6,7,8,9]for start, end in starts, ends:print((start, end)) 正确的例子: sta…

1040 有几个PAT(PAT乙级 C++)

题目 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。 现给定字符串,问一…

在win10+Ubuntu双系统下,完美卸载Ubuntu

本文为转载博客,亲测有效 背景 机器:惠普 暗影精灵3 win10与Ubuntu16.04均为UEFI分区 清除ubuntu系统 使用软件:diskgenius   删除Ubuntu系统使用的几个分区(包括EFI分区),注意不要删除Windows的EFI分…

1048 数字加密(PAT乙级 C++)

题目 本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12&…

在浏览器中在线尝试无服务器框架项目!

无服务器框架是无服务器工具的一致领导者。 但是,没有简单的方法可以在线试用无服务器框架项目。 您确实需要一个体面的开发人员设置,并且需要一些工作来设置sls , npm等。 确切地说,您做到了 –直到现在。 无服务器项目–在您的…

Dev C++源代码未编译

从DevC官网下载的编译器,结果编译程序没问题,但是运行程序时显示源文件未编译。 尝试很多方法。(官网下载不一定最佳)最后通过在其他网站下载重装DevC问题得以解决。 后一个DevC下载网址: https://pc.qq.com/detail/1…

1051 复数乘法(PAT乙级 C++)

题目 复数可以写成 (ABi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i​2​​ −1;也可以写成极坐标下的指数形式 (Re​(Pi)),其中 R 是复数模,P 是辐角,i 是虚数单位&…

java se/ee_嗨,您好 。 。 ! 您如何评价Java / Java EE技能?

java se/ee要知道,就是要知道你一无所知。 那就是真正知识的含义。 苏格拉底 这篇文章旨在为读者提供Java生态系统及其技术堆栈的快速概述。 老实说,从Java EE 7,Java SE 8到Java Embedded 8…,Java平台进行了许多革命性的更改…

SystemC在Ubuntu16.04上安装测试

使用SystemC进行硬件仿真 环境 linux-x86-64bashg 下载解压SystemC SystemC下载地址 解压下载的包 tar zxvf systemc-2.3.3.tar.gz 进入解压出来的目录,准备编译安装 cd systemc-2.3.3 编译安装 打开安装说明文件INSTALL vim INSTALL 按照步骤安装 Create a tem…

1053 住房空置率(PAT乙级 C++ 坑点分析)

题目 在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断。判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给定的阈值 e,则该住房为“可能空置”;若观察期超过某给…

Java:从Java 8开始受益于内联类属性

希望在几年内,Java将具有“内联类”功能,该功能可以解决Java当前状态下的许多挑战。 阅读本文并学习如何立即使用Java 8或更高版本,并且仍将受益于即将出现的内联对象数组的一些优点,例如; 没有间接指针,消…

1054 求平均值(PAT乙级 C++)

题目 本题的基本要求非常简单:给定 N 个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是 [−1000,1000] 区间内的实数,并且最多精确到小数点后 2 位。当你计算平均值的时候,不能把那些非法的数…

ubuntu16.04下安装ibus拼音

按照网上给的安装方法,没成功,在切换ibus的时候总是报错,记录下解决办法。 安装语言包 System Settings–>Language Support–>Install/Remove Languages 选中chinese,点击Apply应用即可,等待下载安装完成。 …

1057 数零壹(PAT乙级 C++实现)

题目 给定一串长度不超过 10​5 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0、多少 1。例如给定字符串 P…