SpringBoot项目配置多数据源

如果需要在同一个Spring Boot应用程序中同时使用PostgreSQL和Oracle数据库,你可以配置多个数据源来实现这一目标。

添加依赖

dependencies {
    implementation 'org.postgresql:postgresql:42.3.1'
    implementation 'com.oracle.database.jdbc:ojdbc8:19.3.0.0'
    //其他依赖项
}


配置文件

spring:
  primary:
    datasource:
      driver-class-name: org.postgresql.Driver
      jdbc-url: jdbc:postgresql://localhost:5432/nap
      username: xxx
      password: xxx
      test-on-borrow: true
      validationQuery: SELECT 1
      name: HikariPool-1
      minimum-idle: 15
      maximum-pool-size: 30
      idle-timeout: 600000
      max-lefetime: 1800000
      connection-timeout: 30000
  secondary:
    datasource:
      driver-class-name: oracle.jdbc.OracleDriver
      jdbc-url: jdbc:oracle:thin:@//localhost:1521/odrd
      username: xxx
      password: xxx
      test-on-borrow: true
      validationQuery: SELECT 1
      name: HikariPool-2
      minimum-idle: 15
      maximum-pool-size: 30
      idle-timeout: 600000
      max-lefetime: 1800000
      connection-timeout: 30000

数据源配置

/**
 * 数据源的配置
 */
@Configuration
public class DataSourceConfig {
    private static Logger logger = LoggerFactory.getLogger(DataSourceConfig.class);

    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @ConfigurationProperties(prefix = "spring.primary.datasource")
    @Primary
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @Qualifier("secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.secondary.datasource")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "primaryJdbcTemplate")
    @Primary
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
        return new JdbcTemplate(primaryDataSource);
    }

    @Bean(name = "secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
        return new JdbcTemplate(secondaryDataSource);
    }


}

配置实体管理

配置完数据源之后,还需要配置一些额外的东西,例如实体Repository的包路径,hibernate以及实体管理器等一系列需要的bean

/**
 * 数据源一
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryPrimary",
        transactionManagerRef = "transactionManagerPrimary",
        basePackages = {"net.skycloud.mtkadaptor.basedata.repository", "net.skycloud.mtkadaptor.order.repository",
                "net.skycloud.mtkadaptor.subnet.repository","net.skycloud.mtkadaptor.user.repository"})
//设置Repository所在位置
public class PrimaryConfig {
    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;

    @Primary
    @Bean(name = "entityManagerPrimary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return Objects.requireNonNull(entityManagerFactoryPrimary(builder).getObject()).createEntityManager();
    }

    @Primary
    @Bean(name = "entityManagerFactoryPrimary")
    //设置实体所在包
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(primaryDataSource)
                .properties(getVendorProperties())
                .packages("net.skycloud.mtkadaptor.basedata.model", "net.skycloud.mtkadaptor.order.model",
                        "net.skycloud.mtkadaptor.subnet.model","net.skycloud.mtkadaptor.user.model","net.skycloud.common.model")
                .persistenceUnit("primaryPersistenceUnit")
                .build();
    }
    //配置hibernate信息 方言等
    private Map<String, String> getVendorProperties() {
        Map<String, String> jpaProperties = new HashMap<>(16);
        jpaProperties.put("hibernate.hbm2ddl.auto", "none");
        jpaProperties.put("hibernate.show_sql", "false");
        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
        jpaProperties.put("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName());
        jpaProperties.put("hibernate.physical_naming_strategy", SpringPhysicalNamingStrategy.class.getName());;
        return jpaProperties;
    }

    @Primary
    @Bean(name = "transactionManagerPrimary")
    //配置事物管理器
    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
    }
}

/**
 * 数据源二
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactorySecondary",
        transactionManagerRef = "transactionManagerSecondary", basePackages = {"net.skycloud.mtkadaptor.odr"})
public class SecondaryConfig {
    @Autowired
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;

    @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(getVendorProperties(secondaryDataSource))
                .packages("net.skycloud.mtkadaptor.odr")
                .persistenceUnit("secondaryPersistenceUnit")
                .build();
    }


    private Map<String, String> getVendorProperties(DataSource dataSource) {
        Map<String, String> jpaProperties = new HashMap<>(16);
        jpaProperties.put("hibernate.hbm2ddl.auto", "none");
        jpaProperties.put("hibernate.show_sql", "false");
        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
        return jpaProperties;
    }

    @Bean(name = "transactionManagerSecondary")
    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
    }
}

配置好之后,你就可以在对应的包下面开发EntityRepository了,至此多数据源的配置就完成了。


标题:SpringBoot项目配置多数据源
作者:Gakkiyomi
地址:https://gakkiyomi.blog/articles/2023/06/09/1686300820668.html

    评论
    22 评论
    wzr514420887 2023-08-24 14:48

    派除我佬

    bando 2023-08-24 11:58

    好,专业!

    dissoluteFate 2023-06-12 13:37

    大GGnb!

    M820 2023-06-12 09:33

    群除我佬

    sleep 2023-06-12 00:00

    666

    Gakkiyomi 2023-06-11 21:43
    回复» @xiaoaonan

    maven的确更主流一点,基本接触的开源的开源项目都是maven, 不过dsl的语义化更好,更喜欢用gradle

    xiong 2023-06-11 16:18

    膜拜

    Gakkiyomi 2023-06-10 17:56
    回复» @ILanZhou

    多强哦

    ILanZhou 2023-06-10 16:03

    为什么不是奇怪的知识,这些我都知道了

    Cloud00001 2023-06-10 14:45

    有用的知识增加了

    stillwarter 2023-06-10 10:12
    回复» @Gakkiyomi

    不会 只会一点html

    Arrogant 2023-06-10 10:11

    群除我佬

    Gakkiyomi 2023-06-10 09:50
    回复» @stillwarter

    猫猫教我前端

    stillwarter 2023-06-10 09:00

    群除我佬

    custom 2023-06-10 08:37

    俺 前端菜狗一个trollface

    rapc001 2023-06-09 17:40
    回复» @Gakkiyomi

    俺 前端菜狗一个trollface

    xiaoaonan 2023-06-09 17:22
    回复» @Gakkiyomi

    果然是大佬,我这小破公司一直都是maven

    Gakkiyomi 2023-06-09 17:22
    回复» @rapc001

    这不都是些很简单的东西吗,只是没人整理

    图片表情

    Gakkiyomi 2023-06-09 17:21
    回复» @xiaoaonan

    什么年代了,18年起就一直用gradle了doge

    xiaoaonan 2023-06-09 17:15

    看着确实比maven舒服好多

    xiaoaonan 2023-06-09 17:14

    项目依赖管理用的gradle嘛
    图片表情

    rapc001 2023-06-09 17:06

    群除我佬

avatar

取消