【问题标题】:spring boot multiple database configuration with microsoft sql server使用 microsoft sql server 启动多个数据库配置
【发布时间】:2017-01-02 23:22:57
【问题描述】:

我在一个 sql server 数据库下有多个数据库。 来自 application.properties 文件。我已经在 springboot 中配置为默认模式。 现在我想用相同的 url、usrname、pawd 切换到另一个数据库。

我怎样才能改变这个?当我用

在类上给出注释时
@table (name = db2.dbo.tname)

它抛出错误说,

无法在数据库 1 中映射此 dboject

这是我的配置:

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=testdb;integratedSecurity=false;

spring.datasource.username=sa
spring.datasource.password=myPassword
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerConnection
spring.datasource.initialize=true

我的应用程序使用我在应用程序属性上提供的默认数据库。但我必须连接到另一个数据库。 我该如何解决这个问题?

【问题讨论】:

    标签: javascript sql-server spring spring-boot


    【解决方案1】:

    您不能使用常规的弹簧属性来执行此操作。这是一个关于如何连接到两个数据库的示例(如果需要,可以连接更多):

    首先,您必须禁用仅获取一个 DB 的自动配置:

    @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})
    

    现在您只需为 JPA 和数据源提供自己的配置:

    @Configuration
    @EnableJpaRepositories(entityManagerFactoryRef = "ds1EntityManagerFactory",
            transactionManagerRef = "ds1TransactionManager",
            basePackageClasses = Ds1Repository.class)
    public class DataSource1Config {
    
        @Bean
        PlatformTransactionManager ds1TransactionManager() {
            return new JpaTransactionManager(tfccgEntityManagerFactory().getObject());
        }
    
        @Bean
        LocalContainerEntityManagerFactoryBean ds1EntityManagerFactory() {
    
            HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    
            LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
    
            factoryBean.setDataSource(ds1());
            factoryBean.setJpaVendorAdapter(vendorAdapter);
            factoryBean.setPackagesToScan(Ds1Entity.class.getPackage().getName());
            factoryBean.getJpaPropertyMap().put("hibernate.dialect", dialect);
            factoryBean.getJpaPropertyMap().put("hibernate.show_sql", showSQL);
            factoryBean.getJpaPropertyMap().put("hibernate.globally_quoted_identifiers", quoteIdentifiers);
    
            return factoryBean;
        }
    
        @Bean
        DataSource ds1() {
            BasicDataSource dataSource = new BasicDataSource();
            dataSource.setUrl(url);
            dataSource.setDriverClassName(driverClass);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            dataSource.setTestOnBorrow(testOnBorrow);
            dataSource.setMaxTotal(maxTotal);
            dataSource.setInitialSize(initialSize);
            dataSource.setMaxIdle(maxIdle);
            return dataSource;
        }
    }
    

    您可以为 ds2 数据源获取此类的副本,在该数据源上您将拥有第二组 transactionManager entityManagerFactorydatasource,并且您将在其上启用 JPA 存储库和实体扫描不同的包并用不同的名称命名bean。

    然后,如果您需要在方法中进行事务隔离,则必须提供 transactionManager 名称,因为您有 2 个:

    @Transactional(transactionManager = "ds1TransactionManager")

    【讨论】:

    • 在数据源url中
    猜你喜欢
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多