当前位置: 首页 > 知识库问答 >
问题:

如何在SpringBootJava8应用程序中配置位于同一数据库服务器上的SQLServer中的多个目录/数据库?

邬友樵
2023-03-14

在我们的应用程序中,我们使用Spring Boot和sqljdbc4。罐子 我们需要连接到同一架构内的不同数据库(目录)(这意味着它们位于同一sql server实例中)。所以,我们需要以这样一种方式配置数据源:它可以连接到多个数据库,并且可以毫无问题地执行数据库操作。但当尝试连接时,它抛出下面的错误

无效对象表\u名称发现错误。//我没有完整的堆栈跟踪,但主要错误是前面提到的无效对象错误。

因此,我们配置了两个数据源,源代码如下所示

项目结构:

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);
  }
}

bar的数据源配置

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

我还浏览了以下链接:如何配置SpringBoot以使用两个数据库?

Spring boot连接mysql中的多个模式

我遵循了许多教程来找到最佳解决方案,并通过了不同的堆栈溢出帖子,但没有一个合适的解决方案

简而言之,我需要满足这些要求。

为了找出这个问题的最佳解决方案,所以如果我们需要配置更多的数据库或模式,当前代码应该根本不会影响。

它应该适用于具有不同数据库名称的不同配置文件/环境。

编辑:使用上面的代码可以很好地工作,但是由于数据库位于同一个数据库服务器实例中,是否有其他优化的解决方案,以便只配置一个数据源?


共有1个答案

萧凡
2023-03-14

我建议您在应用程序的每个实例(实体)中添加目录。这种方式:

@Table(name = "test",catalog = "database_test",schema = "dbo")
 类似资料:
  • 问题内容: 我正在寻找一种处理以下情况的方法: 我们有一个数据库服务器,上面有多个数据库(所有数据库都有相同的架构,不同的数据)。 我们正在寻找一种查询所有数据库的方法(并且它易于配置,因为可以随时添加更多数据库)。此数据访问必须是实时的。 举例来说,假设您有一个插入订单的应用程序- 每个应用程序都有自己的数据库等。我们正在寻找的是一种有效的方式,使单个应用程序可以访问所有其他数据库中的订单信息,

  • 我想创建一个应用程序,我想有多个数据库,这意味着不止两个,至少三个。这可能吗?如果是,请在此处解释。

  • 问题内容: 如何在Zend Framework 2中配置(和使用)多个数据库?目前,我在global.php中有以下内容: 但是我看不到添加第二种方法。 问题答案: 如果查看Zend \ Db \ Adapter \ AdapterServiceFactory,您会看到适配器配置仅指向一个键。这意味着它构建的适配器将始终使用此(唯一)配置密钥。 我建议您创建自己的工厂,如下所示: 在您的主模块(或

  • 我正在用spring boot开发一个应用程序。我使用Mysql数据库来实现持久性。我的数据库在远程服务器上。如何为远程数据库连接配置数据源? 请帮助我在属性文件和数据源bean配置中使用我的配置类中的注释来配置它。

  • 我试图从同一个服务器上的数据库的旧备份创建一个新数据库。当使用SQL服务器管理工作室并试图从备份恢复到新数据库时,我得到这个错误 在谷歌搜索之后,我找到了这段代码 我想知道移动语句是否会干扰备份来自该服务器的数据库? 谢谢,感谢所有的帮助。

  • 问题内容: 我的源表和目标表存在于不同的服务器上。我 用来编写合并语句以使其同步。 谁能解释我如何引用存在于我内部不同服务器上的两个不同数据库 ? 问题答案: 可能的方法: 我建议采用以下方法,而不是尝试在两个数据库服务器之间使用 语句 。 方法1: 为每个SQL Server实例创建两个。例如,如果您有两个数据库SourceDB和DestinationDB,则可以创建两个名为 和的连接管理器 。