1、隨着業務復雜程度的增加,我們在單一數據源上面的使用越來越不滿足具體的業務邏輯以及實現了。
2、那么多數據源,比如多庫多數據庫等,我們在使用一個工程的時候多數據源的連接還是很有必要的,這里做一下記錄
3、實例配置
1)目錄結構
2)依賴包(pom.xml)
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies>
3)application.yaml
server: port: 8080 spring: datasource: first: driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/first?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true username: root password: root second: driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/second?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true username: root password: root jpa: hibernate: ddl-auto: update naming: physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy show-sql: true database-platform: org.hibernate.dialect.MySQL5InnoDBDialect database: mysql
備注:這里參數可以隨便配置,但是使用spring原生的要對應名稱配置。url必須使用jdbc-url的名稱
jpa的其他參數,主要是在jpaProperties里面。為了在新的數據源上面加上對應的參數配置
4)多數據源配置(jpa)
a、DataSourceConfiguration
/** * 數據庫配置 */ @Configuration public class DataSourceConfiguration { /** * 第一個數據連接,默認優先級最高 * @return */ @Bean(name = "dataSourceFirst") @Primary @ConfigurationProperties(prefix = "spring.datasource.first") public DataSource dataSourceFirst() { //這種方式的配置默認只滿足spring的配置方式,如果使用其他數據連接(druid),需要自己獨立獲取配置 return DataSourceBuilder.create().build(); } /** * 第二個數據源 * @return */ @Bean(name = "dataSourceSecond") @ConfigurationProperties(prefix = "spring.datasource.second") public DataSource dataSourceSecond() { return DataSourceBuilder.create().build(); } }
說明:其實這里配置已經完成了,這里就配置了兩個數據源了。可以加入對應的JdbcTemplate,這里不做介紹,比較簡單
b、JpaFirstConfiguration
/** * 第一個數據源,jpa的相關配置 */ @Configuration @EntityScan(basePackages = "com.cetc.domain.first") //1、實體掃描 //2、實體管理ref //3、事務管理 @EnableJpaRepositories( basePackages = "com.cetc.repository.first", entityManagerFactoryRef = "firstEntityManagerFactoryBean", transactionManagerRef = "firstTransactionManager") @EnableTransactionManagement public class JpaFirstConfiguration { //第一個數據源,可以不加Qualifier @Autowired @Qualifier("dataSourceFirst") private DataSource dataSource; //jpa其他參數配置 @Autowired private JpaProperties jpaProperties; //實體管理工廠builder @Autowired private EntityManagerFactoryBuilder factoryBuilder; /** * 配置第一個實體管理工廠的bean * @return */ @Bean(name = "firstEntityManagerFactoryBean") @Primary public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { return factoryBuilder.dataSource(dataSource) //這一行的目的是加入jpa的其他配置參數比如(ddl-auto: update等) //當然這個參數配置可以在事務配置的時候也可以 .properties(jpaProperties.getHibernateProperties(new HibernateSettings())) .packages("com.cetc.domain.first") .persistenceUnit("firstPersistenceUnit") .build(); } /** * EntityManager不過解釋,用過jpa的應該都了解 * @return */ @Bean(name = "firstEntityManager") @Primary public EntityManager entityManager() { return entityManagerFactoryBean().getObject().createEntityManager(); } /** * jpa事務管理 * @return */ @Bean(name = "firstTransactionManager") @Primary public JpaTransactionManager transactionManager() { JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); jpaTransactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject()); return jpaTransactionManager; } }
c、JpaSecondConfiguration
/** * 第二個數據源,jpa的相關配置 */ @Configuration @EntityScan(basePackages = "com.cetc.domain.second") //1、實體掃描 //2、實體管理ref //3、事務管理 @EnableJpaRepositories( basePackages = "com.cetc.repository.second", entityManagerFactoryRef = "secondEntityManagerFactoryBean", transactionManagerRef = "secondTransactionManager") @EnableTransactionManagement public class JpaSecondConfiguration { //第二個數據源,必須加Qualifier @Autowired @Qualifier("dataSourceSecond") private DataSource dataSource; //jpa其他參數配置 @Autowired private JpaProperties jpaProperties; //實體管理工廠builder @Autowired private EntityManagerFactoryBuilder factoryBuilder; /** * 配置第二個實體管理工廠的bean * @return */ @Bean(name = "secondEntityManagerFactoryBean") public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { return factoryBuilder.dataSource(dataSource) .properties(jpaProperties.getHibernateProperties(new HibernateSettings())) .packages("com.cetc.domain.second") .persistenceUnit("secondPersistenceUnit") .build(); } /** * EntityManager不過解釋,用過jpa的應該都了解 * @return */ @Bean(name = "secondEntityManager") public EntityManager entityManager() { return entityManagerFactoryBean().getObject().createEntityManager(); } /** * jpa事務管理 * @return */ @Bean(name = "secondTransactionManager") public JpaTransactionManager transactionManager() { JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); jpaTransactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject()); return jpaTransactionManager; } }
d、測試:
4、源碼:https://github.com/lilin409546297/springboot-twoDataSource