Наша предыдущая установка работает как положено. Теперь мы сделаем еще один шаг и настроим двух отдельных менеджеров сущностей, не влияя на функциональность, достигнутую нами ранее.

Первым шагом будет установка конфигурации менеджера сущностей по умолчанию на первичную.
Это первый шаг
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
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;@Configurationpublic 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(); }} |
Если вы запустите приложение с этой конфигурацией, оно будет работать так же, как и наше приложение ранее.
Теперь пришло время настроить менеджер сущностей только для чтения.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
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.Primary;import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;@Configurationpublic 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(); }} |
Также я добавлю метод к контроллеру, чтобы сохранить модели.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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;@RestControllerpublic class EmployeeContoller { private final EmployeeRepository employeeRepository; public EmployeeContoller(EmployeeRepository employeeRepository) { this.employeeRepository = employeeRepository; } @GetMapping("/employee") public List<Employee> getEmployees() { return employeeRepository.findAll(); } @PostMapping("/employee") @ResponseStatus(HttpStatus.CREATED) public void addEmployee(@RequestBody Employee employee) { employeeRepository.save(employee); }} |
Если вы попытаетесь добавить сотрудника с помощью контроллера, а затем запросите базу данных для чтения, вы увидите, что запись вообще не добавляется.
Итак, у нас есть основной менеджер сущностей, и у нас также есть вторичный менеджер. Вторичный еще не используется. Следующий блог посвящен использованию вторичного диспетчера сущностей только для чтения.
|
Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. См. Оригинальную статью здесь: чтение реплик и Spring Data. Часть 3. Настройка двух менеджеров сущностей. Мнения, высказанные участниками Java Code Geeks, являются их собственными. |