版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38095094/article/details/78700490
SpringBoot实现多数据源配置
springBoot实现多数据源配置,首先在application.properties 中配置两个数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
需要有两个DataSource来读取application.properties的不同配置。
@Configuration
public class DataSourceConfig{
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix="spring.datasource.primary")
public DataSource primaryDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix="spring.datasource.secondary")
public DataSource secondaryDataSource(){
return DataSourceBuilder.create().build();
}
}
JdbcTemplate 支持
在springBoot中对JdbcTemplate的支持比较简单,只需要为其注入对应的datasource即可
@Bean(name = "primaryJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(
@Qualifier("primaryDataSource" DataSource dataSource){
return new JdbcTemplate(dataSource);
}
@Bean(name = "secondaryJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(
@Qualifier("secondaryDataSource" DataSource dataSource){
return new JdbcTemplate(dataSource);
}
这样配置便将不同的数据源配置到不同的JdbcTemplate中了,使用时运用@Autowired注解搭配@Qualifier即可
public class TemplateService{
@Autowired
@Qualifier("primaryJdbcTemplate")
private JdbcTemplate primaryJdbaTemplate
}
JPA 支持
jpa支持的多数据源配置,对于DataSource 的配置如上方JdbcTemplate 所示相同,并且对每一个JPA配置都要搭配一个配置类,在类中需要注意书写正确数据源对应的Entity实体类和Repository
/**
* @Author:高键城
* @time:
* @Discription:Jpa对资源的配置
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManagerPrimary",
basePackages = {"com.gaojiancheng.demo.repository"} //设置repository所在位置
)
public class PrimaryConfig {
@Autowired
@Qualifier("primaryDataSource")
//将前面配置好的PrimaryDataSource 注入到这里
private DataSource primaryDataSource;
@Autowired
private JpaProperties jpaProperties;
//实体类管理器,并作为一个Bean,名称为entityManagerPrimary
@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder){
return entityManagerFactoryBean(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder){
return builder.dataSource(primaryDataSource)
.properties(getVendorProperties(primaryDataSource))
.packages("com.gaojiancheng.demo.model") //设置实体类所在位置
.persistenceUnit("primaryPersistenceUnit")
.build();
}
private Map<String , String> getVendorProperties(DataSource dataSource){
return jpaProperties.getHibernateProperties(dataSource);
}
@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder){
return new JpaTransactionManager(entityManagerFactoryBean(builder).getObject());
}
}
要注意的就是书写正确实体类和repository的位置,按照上面的内容书写号实体类管理器等内容。
配置第二个数据源的时候,不同的就是DataSource 注入的名称,从PrimaryDataSource 改为 SecondaryDataSource
接下来编写实体类的信息
/**
*实体类User
*/
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer age;
public User(){}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
// 省略getter、setter
}
编写对应的Repository
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
最后我们用Junit来进行测试
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests {
@Autowired
private UserRepository userRepository;
@Autowired
private MessageRepository messageRepository;
@Test
public void test() throws Exception {
userRepository.save(new User("aaa", 10));
userRepository.save(new User("bbb", 20));
userRepository.save(new User("ccc", 30));
userRepository.save(new User("ddd", 40));
userRepository.save(new User("eee", 50));
Assert.assertEquals(5, userRepository.findAll().size());
}
}