上一篇咱们介绍了在使用JdbcTemplate来作数据访问时候的多数据源配置实现。接下来咱们继续学习如何在使用Spring Data JPA的时候,完成多数据源的配置和使用。java
先在Spring Boot的配置文件application.properties
中设置两个你要连接的数据库配置,好比这样:mysql
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1 spring.datasource.primary.username=root spring.datasource.primary.password=123456 spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2 spring.datasource.secondary.username=root spring.datasource.secondary.password=123456 spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver # 日志打印执行的SQL spring.jpa.show-sql=true # Hibernate的DDL策略 spring.jpa.hibernate.ddl-auto=create-drop
这里除了JPA自身相关的配置以外,与JdbcTemplate配置时候的数据源配置彻底是一致的git
说明与注意:github
spring.datasource
以后多设置一个数据源名称primary
和secondary
来区分不一样的数据源配置,这个前缀将在后续初始化数据源的时候用到。spring.datasource.secondary.jdbc-url
,而1.x版本使用spring.datasource.secondary.url
。若是你在配置的时候发生了这个报错java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
,那么就是这个配置项的问题。完成多数据源的配置信息以后,就来建立个配置类来加载这些配置信息,初始化数据源,以及初始化每一个数据源要用的JdbcTemplate。spring
因为JPA的配置要比JdbcTemplate的负责不少,因此咱们将配置拆分一下来处理:sql
@Configuration public class DataSourceConfiguration { @Primary @Bean @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } }
能够看到内容跟JdbcTemplate时候是如出一辙的。经过@ConfigurationProperties
能够知道这两个数据源分别加载了spring.datasource.primary.*
和spring.datasource.secondary.*
的配置。@Primary
注解指定了主数据源,就是当咱们不特别指定哪一个数据源的时候,就会使用这个Bean真正差别部分在下面的JPA配置上。数据库
Primary数据源的JPA配置:springboot
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef="entityManagerFactoryPrimary", transactionManagerRef="transactionManagerPrimary", basePackages= { "com.didispace.chapter38.p" }) //设置Repository所在位置 public class PrimaryConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; private Map<String, Object> getVendorProperties() { return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); } @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) .packages("com.didispace.chapter38.p") //设置实体类所在位置 .persistenceUnit("primaryPersistenceUnit") .properties(getVendorProperties()) .build(); } @Primary @Bean(name = "transactionManagerPrimary") public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); } }
Secondary数据源的JPA配置:app
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef="entityManagerFactorySecondary", transactionManagerRef="transactionManagerSecondary", basePackages= { "com.didispace.chapter38.s" }) //设置Repository所在位置 public class SecondaryConfig { @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; private Map<String, Object> getVendorProperties() { return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); } @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) .packages("com.didispace.chapter38.s") //设置实体类所在位置 .persistenceUnit("secondaryPersistenceUnit") .properties(getVendorProperties()) .build(); } @Bean(name = "transactionManagerSecondary") PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); } }
说明与注意:spring-boot
@EnableJpaRepositories
中指定Repository的所在位置LocalContainerEntityManagerFactoryBean
建立的时候,指定Entity所在的位置完成了上面以后,咱们就能够写个测试类来尝试一下上面的多数据源配置是否正确了,好比下面这样:
@Slf4j @RunWith(SpringRunner.class) @SpringBootTest public class Chapter38ApplicationTests { @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()); messageRepository.save(new Message("o1", "aaaaaaaaaa")); messageRepository.save(new Message("o2", "bbbbbbbbbb")); messageRepository.save(new Message("o3", "cccccccccc")); Assert.assertEquals(3, messageRepository.findAll().size()); } }
说明与注意:
本文的相关例子能够查看下面仓库中的chapter3-8
目录:
若是您以为本文不错,欢迎Star支持,您的关注是我坚持的动力!
本文首发: Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置,转载请注明出处。
欢迎关注个人公众号:程序猿DD,得到独家整理的学习资源和平常干货推送。
若是您对个人其余专题内容感兴趣,直达个人我的博客: didispace.com。