这是展示一个SpringBoot应用程序,它使用两个数据源(两个MySQL数据库,一个命名players_db,一个命名coaches_db)和两个连接池(每个数据库使用自己的HikariCP连接池,具有不同的设置)。基于上述配置,从两个不同的提供程序配置两个连接池非常容易。
关键点:
1. 在pom.xml,添加spring-boot-configuration-processor依赖项
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies>
2. 在application.properties,自定义两个配置两个HikariCP连接池,例如app.datasource.ds1和app.datasource.ds2
app.datasource.ds1.url=jdbc:mysql://localhost:3306/players_db?createDatabaseIfNotExist=true app.datasource.ds1.username=root app.datasource.ds1.password=root app.datasource.ds1.connection-timeout=50000 app.datasource.ds1.idle-timeout=300000 app.datasource.ds1.max-lifetime=900000 app.datasource.ds1.maximum-pool-size=8 app.datasource.ds1.minimum-idle=8 app.datasource.ds1.pool-name=MyPoolDS1 app.datasource.ds1.connection-test-query=select 1 from dual app.datasource.ds2.url=jdbc:mysql://localhost:3306/coaches_db?createDatabaseIfNotExist=true app.datasource.ds2.username=root app.datasource.ds2.password=root app.datasource.ds2.connection-timeout=50000 app.datasource.ds2.idle-timeout=300000 app.datasource.ds2.max-lifetime=900000 app.datasource.ds2.maximum-pool-size=4 app.datasource.ds2.minimum-idle=4 app.datasource.ds2.pool-name=MyPoolDS2 app.datasource.ds2.connection-test-query=select 1 from dual spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect logging.level.com.zaxxer.hikari.HikariConfig=DEBUG logging.level.com.zaxxer.hikari=TRACE spring.jpa.show-sql=true
3. 写一个@Bean返回第一个DataSource并将其标记为@Primary
写另一个@Bean返回第二个DataSource
@Configuration public class ConfigureDataSources { @Bean(name = "c1") @Primary @ConfigurationProperties("app.datasource.ds1") public DataSourceProperties firstDataSourceProperties() { return new DataSourceProperties(); } @Bean(name = "c2") @ConfigurationProperties("app.datasource.ds2") public DataSourceProperties secondDataSourceProperties() { return new DataSourceProperties(); } @Bean(name = "ds1") @Primary @ConfigurationProperties("app.datasource.ds1") public HikariDataSource firstDataSource(@Qualifier("c1") DataSourceProperties properties) { return properties.initializeDataSourceBuilder().type(HikariDataSource.class) .build(); } @Bean(name = "ds2") @ConfigurationProperties("app.datasource.ds2") public HikariDataSource secondDataSource(@Qualifier("c2") DataSourceProperties properties) { return properties.initializeDataSourceBuilder().type(HikariDataSource.class) .build(); } }
4. 配置两个EntityManagerFactory并指出要扫描每个包的包
@Configuration @EnableJpaRepositories( entityManagerFactoryRef = "ds1EntityManagerFactory", transactionManagerRef = "ds1TransactionManager", basePackages = "com.jpa.ds1" ) @EnableTransactionManagement public class FirstEntityManagerFactory { @Bean @Primary public LocalContainerEntityManagerFactoryBean ds1EntityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("ds1") DataSource dataSource) { return builder .dataSource(dataSource) .packages(packagesToScan()) .persistenceUnit("ds1-pu") .properties(singletonMap("hibernate.hbm2ddl.auto", "create")) .build(); } @Bean @Primary public PlatformTransactionManager ds1TransactionManager( @Qualifier("ds1EntityManagerFactory") EntityManagerFactory ds1EntityManagerFactory) { return new JpaTransactionManager(ds1EntityManagerFactory); } protected String[] packagesToScan() { return new String[]{ "com.jpa.ds1" }; } }
4.将每个与EntityManager相关领域模型和存储库放在正确的包中:
ds1包目录: Player.java PlyaerRepository.java PlayerService.java
ds2包目录:Coach.java CoachRepository.java CoachService.java
源代码可以在 这里 找到