SpringBoot项目配置多数据源主要分为以下个步骤:
确定好所连接的数据库的资源(包括url username password)
将两个库的信息写入到配置文件中(application.yaml或application.properties都可)
我使用的是两个mysql的数据库,连接信息如下:
spring:
datasource:
ds1:
jdbc-url: xxxx
#数据库用户名
username: xxxx
#数据库密码
password:xxxx
#mysql数据库驱动程序(重要)
driver-class-name: com.mysql.cj.jdbc.Driver
ds2:
jdbc-url: xxxx
#数据库用户名
username: xxxxx
#数据库密码
password: xxxxxx
#mysql数据库驱动程序(重要)
driver-class-name: com.mysql.cj.jdbc.Driver
写完配置文件后,需要根据使用的数据源来建立不同的数据源配置类
首先建立主配置类DataSourceConfig.class,在主配置类中指定刚刚写入的两个数据源,如下:
@Configuration
public class DataSourceConfig {
//第一个数据源
@Bean(name = "firstDataSource")
@Primary
@ConfigurationProperties("spring.datasource.ds1")
@Qualifier("firstDataSource")
public DataSource FirstDataSource() {
return DataSourceBuilder.create().build();
}
//第二个数据源
@Bean(name = "secondDataSource")
@ConfigurationProperties("spring.datasource.ds2")
@Qualifier("secondDataSource")
public DataSource SecondDataSource() {
return DataSourceBuilder.create().build();
}
//加载JPA的相关配置信息
@Autowired
private JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
@Bean(name = "vendorProperties")
public Map<String, Object> getVendorProperties() {
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
}
}
其次,建立主数据源配置类,需要指定与该数据源建立连接的**实体类包**与持久层的**repository接口的包**
1
@Configuration //定义主配置类,在启动时注入bean到spring容器中
@EnableTransactionManagement //开启生明式事务
@EnableJpaRepositories( //用来扫描指定的包及其子包中repository定义
entityManagerFactoryRef="entityManagerFactoryPrimary",
transactionManagerRef="transactionManagerPrimary",
basePackages= { "xxx.xxx.xxx.xx" })//设置dao层(持久层,即repo)所在位置
public class PrimaryDataSourceConfig {
@Resource
@Qualifier("firstDataSource")
private DataSource firstDataSource; //注入主配置类中的主数据源
@Resource
@Qualifier("vendorProperties")
private Map<String, Object> vendorProperties; //jpa加载的相关配置,去掉也可以
@Bean(name = "entityManagerFactoryPrimary")
@Primary //主数据源中要加这个
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(Database.MYSQL);
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("xxx.xxx.xxx.xxx"); //设置实体类包所在位置
factory.setDataSource(firstDataSource); //指定数据源
factory.setJpaPropertyMap(vendorProperties);
return factory;
}
@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
}
这里需要注意的是,几个重要的注解,@Configuration、@EnableJpaRepositories与@Primary不能忘记。
1
下一步,建立第二个数据源的配置类,需要指定的东西与主数据源完全相同,只不过要去掉@Primary的注解
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactorySecondary",
basePackages= { "=com.xxx.xxx.repo" })//设置dao(repo)所在位置
public class SecondaryDataSourceConfig {
@Resource
@Qualifier("secondDataSource")
private DataSource secondDataSource; //注入第二个数据源
@Resource
@Qualifier("vendorProperties")
private Map<String, Object> vendorProperties;
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactory () {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(Database.MYSQL);
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.xxx.xxx.entity"); //指定实体类所在包位置
factory.setDataSource(secondDataSource); //指定数据源
factory.setJpaPropertyMap(vendorProperties);
return factory;
}
@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
}
基本配置已完成,不需要再做其他配置,也不需要修改其他层的代码,接下来就是编写测试代码。
首先建立两个数据源对应的实体类与持久层接口以及业务层接口及其实现,然后生成测试代码,查询库中表数据。
多数据源配置结束!