springboot配置多数据源+jpa实现
Posted 零度anngle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<String, String> getVendorProperties(DataSource dataSource)
Map<String,String> 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<String, String> getVendorProperties(DataSource dataSource)
Map<String,String> 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)
以上是关于springboot配置多数据源+jpa实现的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot+ElasticSearch7.x+JPA配置多数据源
springboot JPA 一对多关联查询 ,动态复杂查询 去除重复数据 in语句使用