SpringBoot实现多数据源配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 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());
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_38095094/article/details/78700490