Springboot多数据源配置以及JPA集成
两个数据源都为oracle数据库。
Springboot多数据源配置以及JPA集成
1、pom文件添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 添加Hibernate支持 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.12.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.12.Final</version>
</dependency>
2、application.yml配置
spring:
profiles:
active: dev
datasource:
druid:
oracle:
type: com.alibaba.druid.pool.DruidDataSource
platform: oracle
url: jdbc:oracle:thin:@127.0.0.1:1521/ORCL
driverClassName: oracle.jdbc.driver.OracleDriver
username: C##development
password: C##development
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 1 from dual
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
filters: stat,wall,log4
logSlowSql: true
secondary:
type: com.alibaba.druid.pool.DruidDataSource
platform: secondary
url: jdbc:oracle:thin:@127.0.0.1:1521/ORCL
driverClassName: oracle.jdbc.driver.OracleDriver
username: C##development
password: C##development
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 1 from dual
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
filters: stat,wall,log4j
logSlowSql: true
jpa:
database: ORACLE
hibernate:
ddl-auto: none
properties.javax.persistence.validation.mode: none
3、添加主数据源以及第二数据源
1)主数据源(OracleDatasourceConfig)
/**
* FileName: OracleDatasourceConfig
* Author: Administrator
* Date: 2021/1/22 14:46
* Description:
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com.yangxf.si.config.datasourse;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.util.Properties;
/**
* 〈默认数据源:oracle数据源〉<br>
* 〈〉
*
* @author Administrator
* @create 2021/1/22
* @since 1.0.0
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = {OracleDatasourceConfig.PACKAGE}
)
public class OracleDatasourceConfig {
// oracle扫描路径
static final String PACKAGE = "com.yangxf.si.modules.business";
@Primary
@Bean(name = "oracleDataSource")
@ConfigurationProperties("spring.datasource.druid.oracle")
public DataSource oracleDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "entityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean em = builder
.dataSource(oracleDataSource())
.packages(new String[]{"com.yangxf.si"})
.persistenceUnit("oracle")
.build();
Properties properties = new Properties();
properties.setProperty("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
em.setJpaProperties(properties);
return em;
}
@Bean(name = "transactionManager")
@Primary
PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactory(builder).getObject());
}
}
2)第二数据源(SecondaryDatasourceConfig)
/**
* FileName: OracleDatasourceConfig
* Author: Administrator
* Date: 2021/1/22 14:46
* Description:
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改时间 版本号 描述
*/
package com.yangxf.si.config.datasourse;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.util.Properties;
/**
* 〈默认数据源:secondary数据源〉<br>
* 〈〉
*
* @author Administrator
* @create 2021/1/22
* @since 1.0.0
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactorySecondary",
transactionManagerRef = "transactionManagerSecondary")
public class SecondaryDatasourceConfig {
// oracle扫描路径
static final String PACKAGE = "com.yangxf.si.modules.business";
@Bean(name = "secondaryDataSource")
@ConfigurationProperties("spring.datasource.druid.secondary")
public DataSource secondaryDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(
EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean em = builder
.dataSource(secondaryDataSource())
.packages(new String[]{"com.yangxf.si"})
.persistenceUnit("secondary")
.build();
Properties properties = new Properties();
properties.setProperty("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
em.setJpaProperties(properties);
return em;
}
@Bean(name = "transactionManagerSecondary")
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}
}
4、项目demo服务实现
package com.yangxf.si.modules.business.service;
import com.yangxf.si.modules.business.entity.ProjectDemo;
import com.yangxf.si.modules.business.entity.ProjectDemoRepository;
import org.hibernate.SQLQuery;
import org.hibernate.transform.Transformers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List;
/**
* 项目demo服务实现
*
* @author Administrator
*/
@Service
public class ProjectDemoServiceImpl implements ProjectDemoService {
@PersistenceContext(unitName = "secondary")
private EntityManager entityManagerSecondary;
@PersistenceContext
private EntityManager entityManager;
@Autowired
private ProjectDemoRepository projectDemoRepository;
@Override
public void saveProjectDemo(final ProjectDemo projectDemo) {
projectDemoRepository.save(projectDemo);
}
/**
* 查询主数据源
* @param name
* @param idNumber
* @return
*/
@Override
public List <ProjectDemo> queryMaster(String name, String idNumber) {
StringBuilder sql = new StringBuilder();
sql.append("select * from PROJECT_DEMO where name=:name and id_Number=:idNumber ");
Query p = entityManager.createNativeQuery(sql.toString());
p.setParameter("name", name);
p.setParameter("idNumber", idNumber);
p.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List <ProjectDemo> list = p.getResultList();
return list;
}
/**
* 查询第二数据源
* @param name
* @param idNumber
* @return
*/
@Override
public List <ProjectDemo> querySecondary(String name, String idNumber) {
StringBuilder sql = new StringBuilder();
sql.append("select * from PROJECT_DEMO where name=:name and id_Number=:idNumber ");
Query p = entityManagerSecondary.createNativeQuery(sql.toString());
p.setParameter("name", name);
p.setParameter("idNumber", idNumber);
p.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List <ProjectDemo> list = p.getResultList();
return list;
}
}