Javascript 使用microsoft sql server进行spring引导多数据库配置

Javascript 使用microsoft sql server进行spring引导多数据库配置,javascript,sql-server,spring,spring-boot,Javascript,Sql Server,Spring,Spring Boot,我在一个sql server数据库下有多个数据库。 从application.properties文件。我已经在springboot中配置为默认模式。 现在我想切换到另一个具有相同url的数据库,usrname,pawd 我该怎么做?当我在课堂上用 @table (name = db2.dbo.tname) 它抛出了一个错误的说法 无法在数据库1中映射此数据库项目 以下是我的配置: spring.datasource.url=jdbc:sqlserver://localhost:1433;da

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

我该怎么做?当我在课堂上用

@table (name = db2.dbo.tname)
它抛出了一个错误的说法

无法在数据库1中映射此数据库项目

以下是我的配置:

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的自动配置:

@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
datasource
,并在其上为不同的包启用JPA存储库和实体扫描,并使用不同的名称命名bean

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


@Transactional(transactionManager=“ds1TransactionManager”)

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

首先,您必须禁用仅拾取一个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
datasource
,并在其上为不同的包启用JPA存储库和实体扫描,并使用不同的名称命名bean

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


@Transactional(transactionManager=“ds1TransactionManager”)

在数据源url中