springboot配置多数据源+jpa实现

配置文件:


#db1 conf
db1.spring.datasource.name=yunpub
db1.spring.datasource.url=jdbc:mysql://10.31.xx.xx:3306/db1?useUnicode=true&autoReconnect=true&characterEncoding=utf-8&generateSimpleParameterMetadata=true
db1.spring.datasource.username=zxu_mysql
db1.spring.datasource.password=123!@#qweQWE
db1.spring.datasource.driverClassName=com.mysql.jdbc.Driver
#db1 hikari conf
db1.spring.datasource.type=com.zaxxer.hikari.HikariDataSource
db1.spring.datasource.autoCommit=true
db1.spring.datasource.readOnly=false
db1.spring.datasource.connectionTimeout=500000
db1.spring.datasource.idleTimeout=600000
db1.spring.datasource.maxLifetime=1800000
db1.spring.datasource.maximumPoolSize=100
db1.spring.datasource.minimumIdle=3
db1.spring.datasource.initialSize=20
db1.spring.datasource.maxWait=600000
#db1 jpa conf
db1.spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

#db2 conf
db2.spring.datasource.name=yunpub_crm
db2.spring.datasource.url=jdbc:mysql://10.31.xx.xx:3306/db2?useUnicode=true&autoReconnect=true&characterEncoding=utf-8&generateSimpleParameterMetadata=true
db2.spring.datasource.username=zxu_mysql
db2.spring.datasource.password=123!@#qweQWE
db2.spring.datasource.driverClassName=com.mysql.jdbc.Driver
#db2 hikari conf
db2.spring.datasource.type=com.zaxxer.hikari.HikariDataSource
db2.spring.datasource.autoCommit=true
db2.spring.datasource.readOnly=false
db2.spring.datasource.connectionTimeout=500000
db2.spring.datasource.idleTimeout=600000
db2.spring.datasource.maxLifetime=1800000
db2.spring.datasource.maximumPoolSize=100
db2.spring.datasource.minimumIdle=3
db2.spring.datasource.initialSize=20
db2.spring.datasource.maxWait=600000
#db2 jpa conf
db2.spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

 

 

配置数据源1:PrimaryDataSourceConfig

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
     entityManagerFactoryRef = "entityManagerFactoryPrimary",//配置连接工厂 entityManagerFactory   
     transactionManagerRef = "transactionManagerPrimary",    //配置 事物管理器  transactionManager   
     basePackages = {"com.citicpub.crm.invoke.repository"}   //设置持久层所在位置  
)
public class PrimaryDataSourceConfig {
 
 @Autowired
 private JpaProperties jpaProperties;
 
 @Value("${db1.spring.jpa.hibernate.dialect}")
 private String primaryDialect;
 
 
 @Bean
 @Primary
 @ConfigurationProperties(prefix = "db1.spring.datasource")
 public DataSourceProperties primaryDataSourceProperties() {
        return new DataSourceProperties();
 }


 @Bean(name = "primaryDataSource")
 @Primary
 @ConfigurationProperties(prefix = "db1.spring.datasource")
 public DataSource primaryDatasource() {   
  //return DataSourceBuilder.create().build();
  return primaryDataSourceProperties().initializeDataSourceBuilder().build();

 }

 
 /**
  *@param builder
  *@return
 */
 @Primary
 @Bean(name = "entityManagerFactoryPrimary")
 public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {   
  return builder           
   //设置数据源           
   .dataSource(primaryDatasource())          
   //设置数据源属性           
   .properties(getVendorProperties(primaryDatasource()))           
   //设置实体类所在位置.扫描所有带有 @Entity 注解的类           
   .packages("com.citicpub.crm.invoke.core")           
   //Spring会将EntityManagerFactory注入到Repository之中,有了 EntityManagerFactory之后,           
   //Repository就能用它来创建 EntityManager了,然后 EntityManager就可以针对数据库执行操作           
   .persistenceUnit("primaryPersistenceUnit")           
   .build();
 }
 
 private Map getVendorProperties(DataSource dataSource) {  
  
  Map map = new HashMap<>();   
  map.put("hibernate.dialect",primaryDialect);// 设置对应的数据库方言 
  map.put("hibernate.hbm2ddl.auto","update");
  map.put("hibernate.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
  map.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
  jpaProperties.setProperties(map); 
  return jpaProperties.getProperties();
  
 }
 
 /**
  * * 配置事物管理器 *
  * * @param builder
  * * @return
  */
 @Bean(name = "transactionManagerPrimary")
 @Primary
 PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {   
  return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
 }
   

}

配置数据源2:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
     entityManagerFactoryRef = "entityManagerFactorySecondary",//配置连接工厂 entityManagerFactory   
     transactionManagerRef = "transactionManagerSecondary", //配置 事物管理器  transactionManager   
     basePackages = {"com.citicpub.crm.invoke.sqlserver.repository"}//设置持久层所在位置  
)
public class SecondaryDataSourceConfig {
 
 @Autowired
 private JpaProperties jpaProperties;
 
 @Value("${db2.spring.jpa.hibernate.dialect}")
 private String secondaryDialect;
 
 
 @Bean
 @ConfigurationProperties(prefix = "db2.spring.datasource")
 public DataSourceProperties secondaryDataSourceProperties() {
        return new DataSourceProperties();
    }
 
 
 
 @Bean(name = "secondaryDataSource")
 @ConfigurationProperties(prefix = "db2.spring.datasource")
 public DataSource secondaryDataSource() {   
  //return DataSourceBuilder.create().build();
  return secondaryDataSourceProperties().initializeDataSourceBuilder().build();
    
 }
 
 
 @Bean(name = "entityManagerSecondary")
 public EntityManager entityManager(EntityManagerFactoryBuilder builder) {   
  return entityManagerFactorySecondary(builder).getObject().createEntityManager();
 }


 
 /**
  *@param builder
  *@return
 */  
 @Bean(name = "entityManagerFactorySecondary")
 public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) {   
  return builder           
   //设置数据源           
   .dataSource(secondaryDataSource())          
   //设置数据源属性           
   .properties(getVendorProperties(secondaryDataSource()))           
   //设置实体类所在位置.扫描所有带有 @Entity 注解的类           
   .packages("com.citicpub.crm.invoke.sqlserver.entity")           
   //Spring会将EntityManagerFactory注入到Repository之中,有了 EntityManagerFactory之后,           
   //Repository就能用它来创建 EntityManager了,然后 EntityManager就可以针对数据库执行操作           
   .persistenceUnit("secondaryPersistenceUnit")           
   .build();
 }
 
 private Map getVendorProperties(DataSource dataSource) {   
  Map map = new HashMap<>();   
  map.put("hibernate.dialect",secondaryDialect);// 设置对应的数据库方言  
  map.put("hibernate.hbm2ddl.auto","update");   //自动更新表结构                
  map.put("hibernate.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
  map.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
  jpaProperties.setProperties(map);   
  return jpaProperties.getProperties();
 }
 
 /**
  * * 配置事物管理器 *
  * * @param builder
  * * @return
  */
 @Bean(name = "transactionManagerSecondary")
 PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {   
  return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
 }

}

3、配置两个不同的jdbcTemplate

@Configuration
public class JdbcTemplateConfig {
 
 @Autowired
 @Qualifier("primaryDataSource")
 private DataSource dataSource;
 
 @Autowired
 @Qualifier("secondaryDataSource")
 private DataSource db2_dataSource;
 
 @Primary
 @Bean("jdbcTemplate")
 public JdbcTemplate jdbcTemplate(@Qualifier("primaryDataSource")DataSource dataSource) {
     return new JdbcTemplate(dataSource);
 }
 
 @Bean("db2_jdbcTemplate")
 public JdbcTemplate db2_jdbcTemplate(@Qualifier("secondaryDataSource")DataSource db2_dataSource) {
     return new JdbcTemplate(db2_dataSource);
 }
 

}

测试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class EntityServiceTest {
 
    @Autowired
    private JdbcTemplate jdbcTemplate;
   
    @Autowired
    @Qualifier("secondaryDataSource")
    private  DataSource ds2;

 

 

   @Test
    public void testEntityServiceMethod(){
     
     DataSource  ds1 = jdbcTemplate.getDataSource();
     
     System.out.println(ds1);
     
     System.out.println(ds2);
     
    }

}

测试结果:

HikariDataSource (HikariPool-1)
HikariDataSource (HikariPool-2)

 

 

你可能感兴趣的:(spring,boot)