隨着業務量發展,咱們一般會進行數據庫拆分或是引入其餘數據庫,從而咱們須要配置多個數據源,如:user一個庫,business一個庫。那麼接下來咱們就要考慮怎麼去在spring boot中實現多個數據源的配置。java
mysql> use `user`; mysql> select * from `user`; +----+-------+----------+ | id | name | password | +----+-------+----------+ | 1 | 用戶A | ****** | +----+-------+----------+ 1 row in set
mysql> use `business`; mysql> select * from `business`; +----+-------+-------------+ | id | name | description | +----+-------+-------------+ | 1 | 業務A | 業務A描述 | +----+-------+-------------+ 1 row in set
@Configuration public class DataSourceConfig { @Primary @Bean(name = "userDataSource") @Qualifier("userDataSource") @ConfigurationProperties(prefix = "spring.datasource.user") public DataSource userDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "businessDataSource") @Qualifier("businessDataSource") @ConfigurationProperties(prefix = "spring.datasource.business") public DataSource businessDataSource() { return DataSourceBuilder.create().build(); } }
spring: datasource: user: driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/user username: root password: 123456 business: driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/business username: root password: 123456
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactoryUser", transactionManagerRef = "transactionManagerUser", //設置Repository所在位置 basePackages = {"com.ppc.spring.example.jpamultidatasource.repository.user"}) public class UserConfig { @Autowired @Qualifier("userDataSource") private DataSource userDataSource; @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; @Primary @Bean(name = "entityManagerUser") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactoryUser(builder).getObject().createEntityManager(); } @Primary @Bean(name = "entityManagerFactoryUser") public LocalContainerEntityManagerFactoryBean entityManagerFactoryUser(EntityManagerFactoryBuilder builder) { return builder .dataSource(userDataSource) //設置entity所在位置 .packages("com.ppc.spring.example.jpamultidatasource.entity.user") .persistenceUnit("userPersistenceUnit") .properties(getVendorProperties()) .build(); } private Map<String, Object> getVendorProperties() { return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); } @Primary @Bean(name = "transactionManagerUser") public PlatformTransactionManager transactionManagerUser(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryUser(builder).getObject()); } }
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactoryBusiness", transactionManagerRef = "transactionManagerBusiness", //設置repository所在位置 basePackages = {"com.ppc.spring.example.jpamultidatasource.repository.business"}) public class BusinessConfig { @Autowired @Qualifier("businessDataSource") private DataSource businessDataSource; @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; @Bean(name = "entityManagerBusiness") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactoryBusiness(builder).getObject().createEntityManager(); } @Bean(name = "entityManagerFactoryBusiness") public LocalContainerEntityManagerFactoryBean entityManagerFactoryBusiness(EntityManagerFactoryBuilder builder) { return builder .dataSource(businessDataSource) .properties(getVendorProperties()) //設置實體類所在位置 .packages("com.ppc.spring.example.jpamultidatasource.entity.business") .persistenceUnit("businessPersistenceUnit") .build(); } private Map<String, Object> getVendorProperties() { return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); } @Bean(name = "transactionManagerBusiness") PlatformTransactionManager transactionManagerBusiness(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryBusiness(builder).getObject()); } }
private Map<String, String> getVendorProperties() { return jpaProperties.getHibernateProperties(userDataSource); }
private Map<String, Object> getVendorProperties() { return jpaProperties.getHibernateProperties(new HibernateSettings()); }
runtimeOnly('mysql:mysql-connector-java:5.1.46')
@RestController @SpringBootApplication public class JpaMultiDatasourceApplication { @Autowired UserRepository userRepository; @Autowired BusinessRepository businessRepository; public static void main(String[] args) { SpringApplication.run(JpaMultiDatasourceApplication.class, args); } @GetMapping("/user/{id}") public User getUser(@PathVariable Long id) { return userRepository.findById(id).orElse(null); } @GetMapping("/business/{id}") public Business getBusiness(@PathVariable Long id) { return businessRepository.findById(id).orElse(null); } }
請求:http://localhost:8080/user/1 結果:{"id":1,"name":"用戶A","password":"******"} 請求:http://localhost:8080/business/1 結果:{"id":1,"name":"業務A","description":"業務A描述"}