如何同时使用两个数据源?

lgxysl 2020-09-13 11:17:24
我想同时使用两个数据源,一些增删改查使用主数据源,另一些使用第二数据源。我希望com.ldw.mapper.secondary下面的接口使用第二数据源,但现在所有接口都是使用主数据源,com.ldw.mapper.secondary下面的也是,这是怎么回事?如何实现com.ldw.mapper.secondary下面的接口使用第二数据源?

下面是DruidConfig配置类

@Configuration
public class DruidConfig {

//配置数据源参数
/*
@ConfigurationProperties(prefix="spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
*/

@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource(){
return new DruidDataSource();
}


@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
//@Primary
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return new DruidDataSource();
}
}


下面是主数据源配置类:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManagerPrimary",
basePackages = {"com.ldw.mapper.primary"})
// 指定该数据源操作的DAO接口包
public class PrimaryConfig {

@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;

@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
}

@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(primaryDataSource)
//.properties(getVendorProperties())
.packages("com.ldw.model.primary")
//设置实体类所在位置
.persistenceUnit("primaryPersistenceUnit")
.build();
}

/*
@Autowired
private Environment env;

private Map getVendorProperties() {

HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect",
env.getProperty("hibernate.dialect"));
properties.put("hibernate.ddl-auto",
"create");
properties.put("hibernate.physical_naming_strategy",
"org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
properties.put("hibernate.implicit_naming_strategy",
"org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
return properties;

}
*/

@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}

}


下面是第二数据源配置类:


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactorySecondary",
transactionManagerRef = "transactionManagerSecondary",
basePackages = {"com.ldw.mapper.secondary"})
//设置DAO接口层所在包位置
public class SecondaryConfig {

@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;

@Bean(name = "entityManagerSecondary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactorySecondary(builder).getObject().createEntityManager();
}

@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondaryDataSource)
//.properties(getVendorProperties())
.packages("com.ldw.model.secondary")
//设置实体类所在包的位置
.persistenceUnit("primaryPersistenceUnit")
.build();
}

/*
@Autowired
private Environment env;
private Map getVendorProperties() {
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto",
env.getProperty("hibernate.hbm2ddl.auto"));
properties.put("hibernate.ddl-auto",
env.getProperty("update"));
properties.put("hibernate.dialect",
env.getProperty("hibernate.dialect"));
properties.put("hibernate.physical_naming_strategy",
"org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
properties.put("hibernate.implicit_naming_strategy",
"org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
return properties;
}
*/

@Bean(name = "transactionManagerSecondary")
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}
}


...全文
3302 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
大叔obnijeh 2020-11-10
  • 打赏
  • 举报
回复
技术上实现是没什么问题的,如果是实际项目建议把另一个非主要的数据库的数据同步过来。
DayDayUp丶 2020-11-10
  • 打赏
  • 举报
回复
s478853630 2020-09-15
  • 打赏
  • 举报
回复
接口配置化,数据源动态管理
KeepSayingNo 2020-09-15
  • 打赏
  • 举报
回复
是不是由于JPA帮你自动生成了数据源,所以建议你在启动类上加: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧