SpringBoot实现多数据源配置

来源:互联网 发布:风水择日秘诀软件 编辑:程序博客网 时间:2024/06/05 15:33

SpringBoot实现多数据源配置

springBoot实现多数据源配置,首先在application.properties 中配置两个数据源

spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1spring.datasource.primary.username=rootspring.datasource.primary.password=rootspring.datasource.primary.driver-class-name=com.mysql.jdbc.Driverspring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2spring.datasource.secondary.username=rootspring.datasource.secondary.password=rootspring.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*/@Entitypublic 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

@Repositorypublic 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());        }    }