В нашем приложении мы используем spring boot AND sqljdbc4.jar.
Нам нужно подключиться к разным базам данных (каталогам) внутри одной схемы (это означает, что они находятся в одном экземпляре сервера SQL). Поэтому нам нужно настроить источник данных таким образом, чтобы он мог подключаться к нескольким базам данных и выполнять операции с базами данных без проблем. Но при попытке подключения выдает
недопустимый объект table_name
найдена ошибка. // У меня нет полной трассировки стека, но основная ошибка, как указано выше, неверная ошибка объекта.
Итак, мы настроили два источника данных, а исходный код выглядит так:
Структура проекта:
src/main/java
- com.foobar
- foo
- domain
- repo
- bar
- domain
- repo
spring.datasource.jdbc-url=jdbc:jdbc:microsoft:sqlserver://HOST:1433;it_foo ```(important note: it_foo will be replaced with qa_foo in different environment which will be managed by profiles)
spring.datasource.username=fooadmin
spring.datasource.password=foo123
spring.datasource.driver-class-name=com.microsoft.jdbc.sqlserver.SQLServerDriver
bar.datasource.jdbc-url=jdbc:jdbc:microsoft:sqlserver://HOST:1433;it_bar(important note: it_foo will be replaced with qa_foo in different environment which will be managed by profiles)
bar.datasource.username=baradmin
bar.datasource.password=bar123
bar.datasource.driver-class-name=com.microsoft.jdbc.sqlserver.SQLServerDriver
Конфигурация источника данных для базы данных foo
package com.foobar;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactory",
basePackages = { "com.foobar.foo.repo" }
)
public class FooDbConfig {
@Primary
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean
entityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("dataSource") DataSource dataSource
) {
return builder
.dataSource(dataSource)
.packages("com.foobar.foo.domain")
.persistenceUnit("foo")
.build();
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("entityManagerFactory") EntityManagerFactory
entityManagerFactory
) {
return new JpaTransactionManager(entityManagerFactory);
}
}
Конфигурация источника данных для бара
med “BarDbConfig.java”
package com.foobar;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "barEntityManagerFactory",
transactionManagerRef = "barTransactionManager",
basePackages = { "com.foobar.bar.repo" }
)
public class BarDbConfig {
@Bean(name = "barDataSource")
@ConfigurationProperties(prefix = "bar.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "barEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean
barEntityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("barDataSource") DataSource dataSource
) {
return
builder
.dataSource(dataSource)
.packages("com.foobar.bar.domain")
.persistenceUnit("bar")
.build();
}
@Bean(name = "barTransactionManager")
public PlatformTransactionManager barTransactionManager(
@Qualifier("barEntityManagerFactory") EntityManagerFactory
barEntityManagerFactory
) {
return new JpaTransactionManager(barEntityManagerFactory);
}
}
и общий код такой же, как и в этой ссылке: https://medium.com/@joeclever/using-multiple-datasources-with-spring-boot-and-spring-data-6430b00c02e7
Я также шел по этим ссылкам: Как настроить загрузку Spring для работы с двумя базами данных?
Spring boot connect с несколькими схемами в mysql
Я следовал многим учебным пособиям, чтобы найти оптимальное решение, и прошел через различные публикации по переполнению стека, но ни у одного нет подходящего решения
Короче говоря, мне нужно выполнить эти требования.
Чтобы найти оптимальное решение для этой проблемы, поэтому, если нам нужно сконфигурировать больше баз данных или схем, текущий код вообще не должен влиять.
Он должен работать для разных профилей / сред с разными именами баз данных.
РЕДАКТИРОВАТЬ: С помощью приведенного выше кода он работает нормально, но поскольку базы данных находятся в одном экземпляре сервера баз данных, есть лидругое оптимальное решение, например, настройка только одного источника данных.