spring boot 多数据源+jndi+H2

spring boot 多数据源+jndi+H2

    • 类DataSourceConfig
    • 类JpafirstConfiguration
    • 类JpasecondConfiguration
    • yml文件

类DataSourceConfig


@Configuration
public class DataSourceConfig {

    //jndi-name为第一优先级,配置就会使用
    @Value("${spring.datasource.first.jndi-name}")
    private String jndiNamefirst;

    //jndi-name为第一优先级,配置就会使用
    @Value("${spring.datasource.second.jndi-name}")
    private String jndiNamesecond;

    /**
     *  第一个数据连接,默认优先级最高
     * @return
     */
    @Bean(name = "dataSourcefirst")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.first")
    public DataSource dataSourceFirst() throws NamingException {
        //jndi-name为第一优先级
        if(!StringUtils.isEmpty(jndiNamefirst))
        {
            JndiObjectFactoryBean bean=new JndiObjectFactoryBean();
            bean.setJndiName(jndiNamefirst);
            bean.setProxyInterface(DataSource.class);
            bean.setLookupOnStartup(false);
            bean.afterPropertiesSet();
            return (DataSource) bean.getObject();
        }
       else
       {
           return DataSourceBuilder.create().build();
       }
    }

    /**
     * 第二个数据源
     * @return
     */
    @Bean(name = "dataSourcesecond")
    @ConfigurationProperties(prefix = "spring.datasource.second")
    public DataSource dataSourceSecond() throws NamingException {
        //jndi-name为第一优先级
        if(!StringUtils.isEmpty(jndiNamesecond))
        {
            JndiObjectFactoryBean bean=new JndiObjectFactoryBean();
            bean.setJndiName(jndiNamesecond);
            bean.setProxyInterface(DataSource.class);
            bean.setLookupOnStartup(false);
            bean.afterPropertiesSet();
            return (DataSource) bean.getObject();
        }
        else
        {
            return DataSourceBuilder.create().build();
        }
    }
}


类JpafirstConfiguration


/**
 * 第一个数据源,jpa的相关配置
 */
@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.repository.first",
        entityManagerFactoryRef = "firstEntityManagerFactoryBean",
        transactionManagerRef = "firstTransactionManager")
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.getProperties(new HibernateSettings()))
                .properties(jpaProperties.getProperties())
                .packages("com.entity.first")
                .persistenceUnit("firstPersistenceUnit")
                .build();
    }

    /**
     * EntityManager
     * @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;
    }

}

类JpasecondConfiguration


/**
 * 第二个数据源,jpa的相关配置
 */
@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.repository.second",
        entityManagerFactoryRef = "secondEntityManagerFactoryBean",
        transactionManagerRef = "secondTransactionManager")
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.getProperties())
                .packages("com.entity.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;
    }
}


yml文件


spring:
  h2:
    console:
      enabled: true
      path: /console
      settings:
        web-allow-others: true
        trace: false
  #多数据源配置
  datasource:
    schema:   #其他数据源需注释掉
      - classpath:sql/*.sql
    initialization-mode: always #其他数据源需注释掉
    first:
      jndi-name: null
      platform: h2  #其他数据源需注释掉
      driver-class-name: org.h2.Driver
      jdbc-url: jdbc:h2:mem:test;MODE=Oracle;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;
      username: sa
      password: 123456
    second:
      jndi-name: null
      platform: h2  #其他数据源需注释掉
      driver-class-name: org.h2.Driver
      jdbc-url: jdbc:h2:mem:test;MODE=Oracle;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;
      username: sa
      password: 123456
  #jap-hibernate
  jpa:
    hibernate:
      ddl-auto:
    show-sql: true
    database-platform: org.hibernate.dialect.H2Dialect


你可能感兴趣的:(Spring,boot,jpa,H2)