Для источника данных 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;
}
}
Код: Выделить всё
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;
}
}
Код: Выделить всё
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}
Кроме того, я проверил, что у HikariDataSource нет ThreadFactory.
Как это решить?
Подробнее здесь: https://stackoverflow.com/questions/790 ... ot-working
Мобильная версия