SpringBoot: конфигурация двух источников данных DDL AUTO не работаетJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 SpringBoot: конфигурация двух источников данных DDL AUTO не работает

Сообщение Anonymous »

Я создаю компонент, который подключается к двум источникам данных, то есть к двум базам данных MySQL. Я использую QueryDSL, поэтому мне нужны менеджеры сущностей для каждого источника данных. Для этого я создал ниже классы конфигурации.
Для источника данных 1

Код: Выделить всё

import javax.sql.DataSource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
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.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import com.zaxxer.hikari.HikariDataSource;

import jakarta.persistence.EntityManagerFactory;

@Configuration(proxyBeanMethods = false)
@EnableJpaRepositories(basePackages = "a.b.c.d.repository.ds1", entityManagerFactoryRef = "ds1EntityManagerFactory",  transactionManagerRef = "ds1TransactionManager")
public class DS1DatasourceConfig {

private Environment environment;

public DS1DatasourceConfig(Environment environment) {
this.environment = environment;
}

@Primary
@Bean(name = "ds1JpaProperties")
@ConfigurationProperties("spring.jpa.ds1")
JpaProperties ds1JpaProperties() {
return new JpaProperties();
}

@Primary
@Bean(name = "ds1DataSourceProperties")
@ConfigurationProperties("spring.datasource.ds1")
DataSourceProperties ds1DataSourceProperties() {
return new DataSourceProperties();
}

@Primary
@Bean(name = "ds1DataSource")
HikariDataSource ds1DataSource(
@Qualifier("ds1DataSourceProperties") DataSourceProperties ds1DataSourceProperties) {
return ds1DataSourceProperties.initializeDataSourceBuilder()
.type(HikariDataSource.class).build();
}

@Primary
@Bean(name = "ds1EntityManagerFactory")
LocalContainerEntityManagerFactoryBean ds1EntityManagerFactory(
EntityManagerFactoryBuilder entityManagerFactoryBuilder,
@Qualifier("ds1DataSource") DataSource dataSource,
@Qualifier("ds1JpaProperties") JpaProperties jpaProperties) {

return entityManagerFactoryBuilder.dataSource(dataSource).packages("a.b.c.d.entity.ds1")
.persistenceUnit("ds1").properties(jpaProperties.getProperties()).build();
}

@Primary
@Bean(name = "ds1TransactionManager")
PlatformTransactionManager ds1TransactionManager(
@Qualifier("ds1EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}

@Bean
DataSourceInitializer ds1DataSourceInitializer(@Qualifier("ds1DataSource") DataSource dataSource) {

DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();

String checkScript = environment.getProperty("spring.sql.init.ds1.mode");
if ("always".compareTo(checkScript) == 0) {
String fileName = environment.getProperty("spring.sql.init.ds1.filename");
if (StringUtils.isEmpty(fileName)) {
fileName = "ds1-data.sql";
}
ClassPathResource classPathResource = new ClassPathResource(fileName);
if (classPathResource.exists()) {

resourceDatabasePopulator.addScript(classPathResource);
}
}

dataSourceInitializer.setDataSource(dataSource);
dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
return dataSourceInitializer;
}
}
Для источника данных 2

Код: Выделить всё

package com.fcc.cp.crs.config;

import javax.sql.DataSource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
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.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import com.zaxxer.hikari.HikariDataSource;

import jakarta.persistence.EntityManagerFactory;

@Configuration(proxyBeanMethods = false)
@EnableJpaRepositories(basePackages = "a.b.c.d.repository.ds2", entityManagerFactoryRef = "ds2EntityManagerFactory",  transactionManagerRef = "ds2TransactionManager")
public class DS2DatasourceConfig {

private Environment environment;

public DS2DatasourceConfig(Environment environment) {
this.environment = environment;
}

@Bean(name = "ds2JpaProperties")
@ConfigurationProperties("spring.jpa.ds2")
JpaProperties ds2JpaProperties() {
return new JpaProperties();
}

@Bean(name = "ds2DataSourceProperties")
@ConfigurationProperties("spring.datasource.ds2")
DataSourceProperties ds2DataSourceProperties() {
return new DataSourceProperties();
}

@Bean(name = "ds2DataSource")
HikariDataSource ds2DataSource(
@Qualifier("ds2DataSourceProperties") DataSourceProperties ds2DataSourceProperties) {
return ds2DataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
}

@Bean(name = "ds2EntityManagerFactory")
LocalContainerEntityManagerFactoryBean ds2EntityManagerFactory(
EntityManagerFactoryBuilder entityManagerFactoryBuilder, @Qualifier("ds2DataSource") DataSource dataSource,
@Qualifier("ds2JpaProperties") JpaProperties jpaProperties) {
return entityManagerFactoryBuilder.dataSource(dataSource).packages("a.b.c.d.entity.ds2")
.persistenceUnit("ds2").properties(jpaProperties.getProperties()).build();
}

@Bean(name = "ds2TransactionManager")
PlatformTransactionManager ds2TransactionManager(
@Qualifier("ds2EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}

@Bean
DataSourceInitializer ds2DataSourceInitializer(@Qualifier("ds2DataSource") DataSource dataSource) {

DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();

String checkScript = environment.getProperty("spring.sql.init.ds2.mode");
if ("always".compareTo(checkScript) == 0) {
String fileName = environment.getProperty("spring.sql.init.ds2.filename");
if (StringUtils.isEmpty(fileName)) {
fileName = "ds2-data.sql";
}
ClassPathResource classPathResource = new ClassPathResource(fileName);
if (classPathResource.exists()) {
resourceDatabasePopulator.addScript(classPathResource);
}
}

dataSourceInitializer.setDataSource(dataSource);
dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
return dataSourceInitializer;
}
}
application.yml

Код: Выделить всё

spring:
datasource:
ds1:
url: jdbc:mysql://${ds1_db_host:localhost}:${ds1_db_port:3306}/${ds1_db_name:ds1}
username: ${ds1_db_user:user}
password: ${ds1_db_pass:password}
ds2:
url: jdbc:mysql://${ds2_db_host:localhost}:${ds2_db_port:3306}/${ds2_db_name:ds2}
username: ${ds2_db_user:user}
password: ${ds2_db_pass:password}
jpa:
ds1:
properties:
show-sql: ${ds1_show_sql:true}
hibernate.dialect: org.hibernate.dialect.MySQLDialect
hibernate.ddl-auto: ${ds1_ddl_auto:update}
hibernate.naming.physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
ds2:
properties:
show-sql: ${ds2_show_sql:true}
hibernate.dialect: org.hibernate.dialect.MySQLDialect
hibernate.ddl-auto: ${ds2_ddl_auto:update}
hibernate.naming.physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
sql:
init:
ds1:
mode: ${ds1_sql_init_mode:never}
ds2:
mode: ${ds2_sql_init_mode:never}
threads:
virtual:
enabled: ${virtual_threads:false}

server:
port: ${port:8085}
Когда я запускаю сервер, все bean-компоненты успешно собираются, и сервер запускается без каких-либо ошибок, но он не создает таблицы в базе данных, и ни один оператор sql не печатается на консоли, даже когда отображается sql верен.
Кроме того, я проверил, что у HikariDataSource нет ThreadFactory.
Как это решить?

Подробнее здесь: https://stackoverflow.com/questions/790 ... ot-working
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»