spring使用microsoft sql server启动多个数据库配置

时间:2017-01-02 23:22:57

标签: javascript sql-server spring spring-boot

我在一个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

我的应用程序使用应用程序属性上的默认db i。但我要连接到另一个数据库。 我怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

首先,您必须禁用只能获取一个数据库的自动配置:

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

现在你只需要为JPA和Datasources提供自己的配置:

@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以及您ll为不同的包启用JPA存储库和实体扫描,并使用不同的名称命名bean。

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

@Transactional(transactionManager = "ds1TransactionManager")

相关问题