在 spring 引导中配置多个 azure sql 数据库
Configuring multiple azure sql databases in spring boot
我正在尝试配置两个使用相同 azure sql username/password 但不同 urls/databases 的数据源。我正在使用 @Primary 注释并将数据访问层拆分到它们自己的文件夹中,但只有没有 @Primary 的配置被配置。
数据源 1:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = Constants.BASE_PAKAGE,
entityManagerFactoryRef = Constants.ENTITY_MANAGER_FACTORY,
transactionManagerRef= Constants.TRANSACTION_MANAGER)
public class DataSourceConfiguration {
private Logger log = LoggerFactory.getLogger(this.getClass());
public DataSourceConfiguration(Environment environment) {
this.environment = environment;
}
private Environment environment;
@Primary
@Bean
public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
}
@Primary
@Bean(name = Constants.ENTITY_MANAGER_FACTORY)
public LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory(
EntityManagerFactoryBuilder builder) throws IllegalAccessException, InvocationTargetException, InstantiationException {
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect",environment.getProperty("sqlserver.datasource1.dialect"));
return builder
.dataSource(dataSource())
.packages(Constants.ENTITY_PATH)
.properties(properties)
.build();
}
@Primary
@Bean
public PlatformTransactionManager sqlserverTransactionManager(
final @Qualifier(Constants.ENTITY_MANAGER_FACTORY) LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory) {
return new JpaTransactionManager(sqlserverEntityManagerFactory.getObject());
}
@Primary
@Bean
protected HikariDataSource dataSource() throws IllegalAccessException, InvocationTargetException, InstantiationException {
HikariConfig config = new HikariConfig();
config.setDriverClassName(environment.getProperty("sqlserver.datasource1.driver"));
config.setJdbcUrl(this.buildSnowflakeJDBCUrl());
config.setUsername(environment.getProperty("sqlserver.datasource1.username"));
config.setPassword(environment.getProperty("sqlserver.datasource1.password"));
HikariDataSource dataSource = new HikariDataSource(config);
return dataSource;
}
private String buildSnowflakeJDBCUrl() {
StringBuilder url = new StringBuilder();
url.append(environment.getProperty("sqlserver.datasource1.url"));
return url.toString();
}
}
和数据源 2:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = Constants.BASE_PACKAGE2,
entityManagerFactoryRef = "sqlserver2EntityManagerFactory",
transactionManagerRef= "sqlserver2TransactionManager")
public class DataSourceConfiguration2 {
private Logger log = LoggerFactory.getLogger(this.getClass());
public PhDataSourceConfiguration(Environment environment) {
this.environment = environment;
}
private Environment environment;
@Bean
public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
}
@Bean(name = "sqlserver2EntityManagerFactory")
public LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory(
EntityManagerFactoryBuilder builder) throws IllegalAccessException, InvocationTargetException, InstantiationException {
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect",environment.getProperty("sqlserver.datasource2.dialect"));
return builder
.dataSource(dataSource())
.packages(Constants.ENTITY_PATH2)
.properties(properties)
.build();
}
@Bean(name = "sqlserver2TransactionManager")
public PlatformTransactionManager sqlserverTransactionManager(
final @Qualifier("sqlserver2EntityManagerFactory") LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory) {
return new JpaTransactionManager(sqlserverEntityManagerFactory.getObject());
}
@Bean
protected HikariDataSource dataSource() throws IllegalAccessException, InvocationTargetException, InstantiationException {
HikariConfig config = new HikariConfig();
config.setDriverClassName(environment.getProperty("sqlserver.datasource2.driver"));
config.setJdbcUrl(this.buildJDBCUrl());
config.setUsername(environment.getProperty("sqlserver.datasource2.username"));
config.setPassword(environment.getProperty("sqlserver.datasource2.password"));
HikariDataSource dataSource = new HikariDataSource(config);
return dataSource;
}
private String buildJDBCUrl() {
StringBuilder url = new StringBuilder();
url.append(environment.getProperty("sqlserver.datasource2.url"));
return url.toString();
}
}
这是否是一个问题,因为他们都从同一个 user/password 读取天蓝色 sql?我怎样才能让这两个配置都起作用?
谢谢Andrew S。将您的建议作为答案发布以帮助其他社区成员。
Some of the bean names overlap (using the method name if not
specified), so the last @Bean processed would win. Try explicitly
naming the beans, and @Qualifier the correct bean instance is injected
where needed.
我正在尝试配置两个使用相同 azure sql username/password 但不同 urls/databases 的数据源。我正在使用 @Primary 注释并将数据访问层拆分到它们自己的文件夹中,但只有没有 @Primary 的配置被配置。
数据源 1:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = Constants.BASE_PAKAGE,
entityManagerFactoryRef = Constants.ENTITY_MANAGER_FACTORY,
transactionManagerRef= Constants.TRANSACTION_MANAGER)
public class DataSourceConfiguration {
private Logger log = LoggerFactory.getLogger(this.getClass());
public DataSourceConfiguration(Environment environment) {
this.environment = environment;
}
private Environment environment;
@Primary
@Bean
public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
}
@Primary
@Bean(name = Constants.ENTITY_MANAGER_FACTORY)
public LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory(
EntityManagerFactoryBuilder builder) throws IllegalAccessException, InvocationTargetException, InstantiationException {
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect",environment.getProperty("sqlserver.datasource1.dialect"));
return builder
.dataSource(dataSource())
.packages(Constants.ENTITY_PATH)
.properties(properties)
.build();
}
@Primary
@Bean
public PlatformTransactionManager sqlserverTransactionManager(
final @Qualifier(Constants.ENTITY_MANAGER_FACTORY) LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory) {
return new JpaTransactionManager(sqlserverEntityManagerFactory.getObject());
}
@Primary
@Bean
protected HikariDataSource dataSource() throws IllegalAccessException, InvocationTargetException, InstantiationException {
HikariConfig config = new HikariConfig();
config.setDriverClassName(environment.getProperty("sqlserver.datasource1.driver"));
config.setJdbcUrl(this.buildSnowflakeJDBCUrl());
config.setUsername(environment.getProperty("sqlserver.datasource1.username"));
config.setPassword(environment.getProperty("sqlserver.datasource1.password"));
HikariDataSource dataSource = new HikariDataSource(config);
return dataSource;
}
private String buildSnowflakeJDBCUrl() {
StringBuilder url = new StringBuilder();
url.append(environment.getProperty("sqlserver.datasource1.url"));
return url.toString();
}
}
和数据源 2:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = Constants.BASE_PACKAGE2,
entityManagerFactoryRef = "sqlserver2EntityManagerFactory",
transactionManagerRef= "sqlserver2TransactionManager")
public class DataSourceConfiguration2 {
private Logger log = LoggerFactory.getLogger(this.getClass());
public PhDataSourceConfiguration(Environment environment) {
this.environment = environment;
}
private Environment environment;
@Bean
public EntityManagerFactoryBuilder entityManagerFactoryBuilder() {
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), new HashMap<>(), null);
}
@Bean(name = "sqlserver2EntityManagerFactory")
public LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory(
EntityManagerFactoryBuilder builder) throws IllegalAccessException, InvocationTargetException, InstantiationException {
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect",environment.getProperty("sqlserver.datasource2.dialect"));
return builder
.dataSource(dataSource())
.packages(Constants.ENTITY_PATH2)
.properties(properties)
.build();
}
@Bean(name = "sqlserver2TransactionManager")
public PlatformTransactionManager sqlserverTransactionManager(
final @Qualifier("sqlserver2EntityManagerFactory") LocalContainerEntityManagerFactoryBean sqlserverEntityManagerFactory) {
return new JpaTransactionManager(sqlserverEntityManagerFactory.getObject());
}
@Bean
protected HikariDataSource dataSource() throws IllegalAccessException, InvocationTargetException, InstantiationException {
HikariConfig config = new HikariConfig();
config.setDriverClassName(environment.getProperty("sqlserver.datasource2.driver"));
config.setJdbcUrl(this.buildJDBCUrl());
config.setUsername(environment.getProperty("sqlserver.datasource2.username"));
config.setPassword(environment.getProperty("sqlserver.datasource2.password"));
HikariDataSource dataSource = new HikariDataSource(config);
return dataSource;
}
private String buildJDBCUrl() {
StringBuilder url = new StringBuilder();
url.append(environment.getProperty("sqlserver.datasource2.url"));
return url.toString();
}
}
这是否是一个问题,因为他们都从同一个 user/password 读取天蓝色 sql?我怎样才能让这两个配置都起作用?
谢谢Andrew S。将您的建议作为答案发布以帮助其他社区成员。
Some of the bean names overlap (using the method name if not specified), so the last @Bean processed would win. Try explicitly naming the beans, and @Qualifier the correct bean instance is injected where needed.