В моем текущем стремлении сделать сохранение в двух источниках данных работающим, я пытаюсь добавить два источника данных в мой файл application.properties, задав им пользовательские префиксы, как это сделано в официальной весенней документации: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-two-datasources.
Когда я делаю это и вставляю данные, которые не будут сохранены в базе данных mysql, я получаю пустые наборы данных и ошибку (см. Ниже). Однако, если я использую исходный префикс в источнике данных и измененный префикс в другой базе данных, он сохранится, но только в базе данных с неизменным префиксом.
Это моя конфигурация для пользователя (db1):
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
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;
public class UserConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix="spring.datasource.db1")
public DataSourceProperties firstDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource.db1.configuration")
public HikariDataSource firstDataSource() {
return firstDataSourceProperties().initializeDataSourceBuilder()
.type(HikariDataSource.class).build();
}
@Primary
@Bean
public LocalContainerEntityManagerFactoryBean userEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(firstDataSource())
.packages("User.class")//User.class
.persistenceUnit("users")
.build();
}
}
конфигурация для продукта (db2)
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
public class ProductConfiguration {
@Bean
@ConfigurationProperties(prefix="spring.datasource.db2")
public DataSourceProperties secondDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("spring.datasource.db2.configuration")
public BasicDataSource secondDataSource() {
return secondDataSourceProperties().initializeDataSourceBuilder()
.type(BasicDataSource.class).build();
}
@Bean
public LocalContainerEntityManagerFactoryBean productEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondDataSource())
.packages("Product.class")//Product.class
.persistenceUnit("products")
.build();
}
}
файл application.properties, который не работает
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
spring.datasource.db1.url=jdbc:mysql://localhost/db1?autoReconnect=true&useSSL=false
spring.datasource.db1.username=user
spring.datasource.db1.password=pass
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db1.configuration.maximum-pool-size=30
spring.datasource.db2.url=jdbc:mysql://localhost/db2?autoReconnect=true&useSSL=false
spring.datasource.db2.username=user
spring.datasource.db2.password=pass
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db2.max-total=30
ошибка
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
файл application.properties, который работает наполовину. Сохраняются только данные в 1 дБ.
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
spring.datasource.url=jdbc:mysql://localhost/db1?autoReconnect=true&useSSL=false
spring.datasource.username=user
spring.datasource.password=pass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.configuration.maximum-pool-size=30
spring.datasource.db2.url=jdbc:mysql://localhost/db2?autoReconnect=true&useSSL=false
spring.datasource.db2.username=user
spring.datasource.db2.password=pass
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db2.max-total=30
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"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test.multidb</groupId>
<artifactId>multipledb</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
</project>
Так что мне остается верить, что мое приложение не принимает измененный префикс. Что мне здесь не хватает?
Я пытался использовать разные версии зависимостей maven, разные обозначения драйверов, пытался добавить зависимость базы данных H2. Но я спотыкаюсь от ошибки к ошибке.