springboot项目配置多数据源
springboot从2.0开始默认数据库连接池 Hikari,在配置多数据源时想自定义连接池配置可以参考如下…
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
application.yml
spring:
datasource:
primary:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://127.0.0.1:3306/first?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123123
connectionTimeout: 60000
maximumPoolSize: 5
maxLifetime: 0
idleTimeout: 0
poolName: hikari-01
secondary:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://127.0.0.1:3306/second?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123123
connectionTimeout: 60000
maximumPoolSize: 5
maxLifetime: 0
idleTimeout: 0
poolName: hikari-02
jpa:
show-sql: true
hibernate:
ddl-auto: none
database-platform: org.hibernate.dialect.MySQL8Dialect
open-in-view: true
第一数据源配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.wanfeng.multidatasource.repository.primary"},
entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManagerPrimary")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public class PrimaryConfig extends HikariConfig {
private final JpaProperties jpaProperties;
private final HibernateProperties hibernateProperties;
public PrimaryConfig(JpaProperties jpaProperties, HibernateProperties hibernateProperties) {
this.jpaProperties = jpaProperties;
this.hibernateProperties = hibernateProperties;
}
@Bean(name = "primaryDataSource")
@Primary
public DataSource primaryDataSource() {
return new HikariDataSource(this);
}
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return Objects.requireNonNull(entityManagerFactoryPrimary(builder).getObject()).createEntityManager();
}
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(primaryDataSource())
.properties(hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(),
new HibernateSettings()))
//设置实体类所在位置
.packages("com.wanfeng.multidatasource.entity.primary")
.persistenceUnit("primaryPersistenceUnit")
.build();
}
@Bean(name = "transactionManagerPrimary")
PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactoryPrimary(builder).getObject()));
}
}
第二数据源配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.wanfeng.multidatasource.repository.secondary",
entityManagerFactoryRef = "entityManagerFactorySecondary",
transactionManagerRef = "transactionManagerSecondary")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public class SecondaryConfig extends HikariConfig {
private final JpaProperties jpaProperties;
private final HibernateProperties hibernateProperties;
public SecondaryConfig(JpaProperties jpaProperties, HibernateProperties hibernateProperties) {
this.jpaProperties = jpaProperties;
this.hibernateProperties = hibernateProperties;
}
@Bean(name = "secondaryDataSource")
public DataSource secondaryDataSource() {
return new HikariDataSource(this);
}
@Bean(name = "entityManagerSecondary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return Objects.requireNonNull(entityManagerFactorySecondary(builder).getObject()).createEntityManager();
}
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondaryDataSource())
.properties(hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(),
new HibernateSettings()))
.packages("com.wanfeng.multidatasource.entity.secondary")
.persistenceUnit("secondaryPersistenceUnit")
.build();
}
@Bean(name = "transactionManagerSecondary")
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactorySecondary(builder).getObject()));
}
}