• springboot2+JPA 配置多数据源(不同类型数据库)


    注意:看此篇文章之前,springboot+jpa的配置环境应搭建好,不会搭可以自行百度。本文章主要讲述配置JPA多数据源。

    1.数据源配置文件

    application.properties

    1. # 数据源thirded(oracle数据库)
    2. spring.jpa.thirded.database-platform=org.hibernate.dialect.Oracle10gDialect
    3. spring.jpa.thirded.show-sql=false
    4. spring.jpa.thirded.hibernate.ddl-auto=none
    5. # 数据源fourth (mysql数据库)
    6. spring.jpa.fourth.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    7. spring.jpa.fourth.show-sql=true
    8. spring.jpa.fourth.hibernate.ddl-auto=none

    上面的 thirded 和 fourth 是我给这两个数据源起的别名

    application.yml

    1. spring:
    2. datasource:
    3. thirded:
    4. thirded:
    5. url: jdbc:oracle:thin:@//127.0.0.1:1521/orcl
    6. username: lpsgt
    7. password: lpsgt
    8. driverClassName: oracle.jdbc.OracleDriver
    9. database: oracle
    10. configuration:
    11. maximum-pool-size: 30
    12. fourth:
    13. url: jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai
    14. username: root
    15. password: root
    16. driverClassName: com.mysql.cj.jdbc.Driver
    17. database: mysql
    18. configuration:
    19. maximum-pool-size: 30

    2.创建数据源配置类

    数据源管理类:DataSourceConfig.java

    1. package com.lns.analysis.config;
    2. import org.springframework.beans.factory.annotation.Qualifier;
    3. import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
    4. import org.springframework.boot.context.properties.ConfigurationProperties;
    5. import org.springframework.context.annotation.Bean;
    6. import org.springframework.context.annotation.Configuration;
    7. import org.springframework.context.annotation.Primary;
    8. import javax.sql.DataSource;
    9. @Configuration
    10. public class DataSourceConfig {
    11. @Bean("thirdedProperties")
    12. @ConfigurationProperties(prefix = "spring.datasource.thirded")
    13. public DataSourceProperties thirdedProperties() {
    14. return new DataSourceProperties();
    15. }
    16. @Bean("fourthProperties")
    17. @ConfigurationProperties(prefix = "spring.datasource.fourth")
    18. public DataSourceProperties fourthProperties() {
    19. return new DataSourceProperties();
    20. }
    21. @Bean(name = "thirdedDataSource")
    22. public DataSource thirdedDataSource(
    23. @Qualifier(value = "thirdedProperties") DataSourceProperties dataSourceProperties) {
    24. DataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().build();
    25. return dataSource;
    26. }
    27. @Bean(name = "fourthDataSource")
    28. public DataSource fourthDataSource(
    29. @Qualifier(value = "fourthProperties") DataSourceProperties dataSourceProperties) {
    30. DataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().build();
    31. return dataSource;
    32. }
    33. }

    DataSourceConfig.java该类主要读取了配置文件里的参数,然后根据参数初始化自动生成数据源,提供数据库连接。

    配置多个数据源时,注意每个数据源对应的实体类,jpa类单独放一个包里面

    thirded数据源——JPA配置类:

    1. package com.lns.analysis.config;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.beans.factory.annotation.Qualifier;
    4. import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
    5. import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
    6. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
    7. import org.springframework.boot.context.properties.ConfigurationProperties;
    8. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
    9. import org.springframework.context.annotation.Bean;
    10. import org.springframework.context.annotation.Configuration;
    11. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    12. import org.springframework.orm.jpa.JpaTransactionManager;
    13. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    14. import org.springframework.transaction.PlatformTransactionManager;
    15. import org.springframework.transaction.annotation.EnableTransactionManagement;
    16. import javax.persistence.EntityManager;
    17. import javax.persistence.EntityManagerFactory;
    18. import javax.sql.DataSource;
    19. @Slf4j
    20. @Configuration
    21. @EnableTransactionManagement
    22. @EnableJpaRepositories(
    23. basePackages = "com.lns.analysis.repository.thirded",
    24. entityManagerFactoryRef = "thirdedEntityManagerFactory",
    25. transactionManagerRef = "thirdedTransactionManager")
    26. public class ThirdedConfig {
    27. @Bean(name = "thirdedJpaProperties")
    28. @ConfigurationProperties(prefix = "spring.jpa.thirded")
    29. public JpaProperties jpaProperties() {
    30. return new JpaProperties();
    31. }
    32. @Bean(name = "thirdedEntityManagerFactory")
    33. public LocalContainerEntityManagerFactoryBean entityManagerFactory(
    34. @Qualifier("thirdedDataSource") DataSource thirdedDataSource,
    35. @Qualifier("thirdedJpaProperties") JpaProperties jpaProperties,
    36. EntityManagerFactoryBuilder builder) {
    37. LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean =
    38. builder
    39. // 设置数据源
    40. .dataSource(thirdedDataSource)
    41. // 设置jpa配置
    42. .properties(jpaProperties.getProperties())
    43. // 设置hibernate配置
    44. .properties(
    45. new HibernateProperties()
    46. .determineHibernateProperties(
    47. jpaProperties.getProperties(), new HibernateSettings()))
    48. // 设置实体包名
    49. .packages("com.lns.analysis.domain.thirded")
    50. // 设置持久化单元名,用于@PersistenceContext注解获取EntityManager时指定数据源
    51. .persistenceUnit("thirdedPersistenceUnit")
    52. .build();
    53. return localContainerEntityManagerFactoryBean;
    54. }
    55. @Bean(name = "thirdedEntityManager")
    56. public EntityManager entityManager(
    57. @Qualifier("thirdedEntityManagerFactory") EntityManagerFactory factory) {
    58. return factory.createEntityManager();
    59. }
    60. @Bean(name = "thirdedTransactionManager")
    61. public PlatformTransactionManager transactionManager(
    62. @Qualifier("thirdedEntityManagerFactory") EntityManagerFactory factory) {
    63. return new JpaTransactionManager(factory);
    64. }
    65. }

    这个JPA配置类获取到了 第2节 中的DataSource数据源,配置文件,然后扫描JPA的包路径下所有配置类。

    注意:上述代码包含了JPA类的所在包名,配置文件。跟我不一样的地方,注意要替换成你的。
     

    com.lns.analysis.repository.thirded:JPA存储库包名
    spring.jpa.thirded:上面第1节数据源配置文件里的配置
    com.lns.analysis.domain.thirded:实体类包名

    fourth数据源——JPA配置类:

    1. package com.lns.analysis.config;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.beans.factory.annotation.Qualifier;
    4. import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
    5. import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
    6. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
    7. import org.springframework.boot.context.properties.ConfigurationProperties;
    8. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
    9. import org.springframework.context.annotation.Bean;
    10. import org.springframework.context.annotation.Configuration;
    11. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    12. import org.springframework.orm.jpa.JpaTransactionManager;
    13. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    14. import org.springframework.transaction.PlatformTransactionManager;
    15. import org.springframework.transaction.annotation.EnableTransactionManagement;
    16. import javax.persistence.EntityManager;
    17. import javax.persistence.EntityManagerFactory;
    18. import javax.sql.DataSource;
    19. @Slf4j
    20. @Configuration
    21. @EnableTransactionManagement
    22. @EnableJpaRepositories(
    23. basePackages = "com.lns.analysis.repository.fourth",
    24. entityManagerFactoryRef = "fourthEntityManagerFactory",
    25. transactionManagerRef = "fourthTransactionManager")
    26. public class FourthConfig {
    27. @Bean(name = "fourthJpaProperties")
    28. @ConfigurationProperties(prefix = "spring.jpa.fourth")
    29. public JpaProperties jpaProperties() {
    30. return new JpaProperties();
    31. }
    32. @Bean(name = "fourthEntityManagerFactory")
    33. public LocalContainerEntityManagerFactoryBean entityManagerFactory(
    34. @Qualifier("fourthDataSource") DataSource fourthDataSource,
    35. @Qualifier("fourthJpaProperties") JpaProperties jpaProperties,
    36. EntityManagerFactoryBuilder builder) {
    37. LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean =
    38. builder
    39. // 设置数据源
    40. .dataSource(fourthDataSource)
    41. // 设置jpa配置
    42. .properties(jpaProperties.getProperties())
    43. // 设置hibernate配置
    44. .properties(
    45. new HibernateProperties()
    46. .determineHibernateProperties(
    47. jpaProperties.getProperties(), new HibernateSettings()))
    48. // 设置实体包名
    49. .packages("com.lns.analysis.domain.fourth")
    50. // 设置持久化单元名,用于@PersistenceContext注解获取EntityManager时指定数据源
    51. .persistenceUnit("fourthPersistenceUnit")
    52. .build();
    53. return localContainerEntityManagerFactoryBean;
    54. }
    55. @Bean(name = "fourthEntityManager")
    56. public EntityManager entityManager(
    57. @Qualifier("fourthEntityManagerFactory") EntityManagerFactory factory) {
    58. return factory.createEntityManager();
    59. }
    60. @Bean(name = "fourthTransactionManager")
    61. public PlatformTransactionManager transactionManager(
    62. @Qualifier("fourthEntityManagerFactory") EntityManagerFactory factory) {
    63. return new JpaTransactionManager(factory);
    64. }
    65. }

    跟上面thirded的配置一样,注意包名、路径需要更换成你的

    以上2个数据源的配置部分就已经完成了,运行项目,如果没有报错就是配置成功了。

    多数据源的使用:不用额外的操作,因为我们已经用配置类配置好了,还是像之前单个数据源一样接口调用增删改查接口。

    调用示例:

     

  • 相关阅读:
    C#/.NET/.NET Core优秀项目和框架2024年1月简报
    【Docker教程系列】Docker学习5-Docker镜像理解
    在SpringBoot中使用EhCache缓存
    QT画图板
    面对陕西省2022年职称评审政策调整有没有好的对策
    网页使用之如何返回json/xml
    电脑录屏怎么录?3个方法,教你如何录制视频
    【Github】 Github修改仓库的基本信息
    vue全局使用sass变量
    ITR服务体系的常见问题和华为构建ITR的经验分享
  • 原文地址:https://blog.csdn.net/qq_43082438/article/details/125443910