zoukankan      html  css  js  c++  java
  • springboot之jpa多数据源

      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

  • 相关阅读:
    cas 单点登录(SSO)实验之二: cas-client
    前端要给力之:语句在JavaScript中的值
    【Linux】Tomcat安装及一个服务器配置多个Tomcat
    【Linux】 JDK安装及配置 (tar.gz版)
    Android自动化测试中AccessibilityService获取控件信息(1)
    Android自动化框架 模拟操作 模拟测试
    Android应用程序如何调用shell脚本(一)
    关于lidroid xUtils 开源项目
    android 开源项目列表【持续整理中。。。】
    android开发常用组件【持续更新中。。。】
  • 原文地址:https://www.cnblogs.com/ll409546297/p/10496346.html
Copyright © 2011-2022 走看看