Springboot + Jpa + oracle 双数据源 在业务场景上比较常用,常用于项目中数据转换与清理,承接数据转换服务等。
项目结构
引入 jpa,ojdbc,lombok,日志依赖等。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>21.1.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
<!--日志-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉springboot默认配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 引入log4j2依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
多数据源配置,主数据源 primary 和次 数据源 secondary
#oracle - primary
spring.datasource.primary.jdbc-url=第一个数据源的url
spring.datasource.primary.username=第一个数据源的username
spring.datasource.primary.password=第一个数据源的password
spring.datasource.primary.driver-class-name=oracle.jdbc.driver.OracleDriver
#oracle - secondary
spring.datasource.secondary.jdbc-url=第二个数据源的url
spring.datasource.secondary.username=第二个数据源的username
spring.datasource.secondary.password=第二个数据源的password
spring.datasource.secondary.driver-class-name=oracle.jdbc.driver.OracleDriver
# port 端口
server.port=8081
首先新建数据源配置 于config文件下创建DataSourceConfig,定义数据源,并且注明一个主数据源,一个从数据源.。
/**
* @author yueyi
* @Date 2021年11月26日14:49:20
*/
@Slf4j
@Configuration
public class DataSourceConfig {
//主数据源
@Primary
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties("spring.datasource.primary") //对应 application.properties配置文件
public DataSource primaryDataSource() {
log.info("主数据源primary加载");
return DataSourceBuilder.create().build();
}
//次数据源
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties("spring.datasource.secondary")
public DataSource secondaryDataSource() {
log.info("从数据源secondary加载");
return DataSourceBuilder.create().build();
}
}
配置了两个数据源之后,程序会去连接这两个数据库,这样默认的连接已经不能支撑了,这个时候需要两个数据库文件告诉程序如何去连接这两个数据库。
新建两个数据库定义文件PrimaryConfig.java与SecondaryConfig.java,分别定义主从数据库。
PrimaryConfig.java
/**
* @author yueyi
* @Date 2021年11月26日14:55:18
* 主数据源的配置文件
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerPrimary",
transactionManagerRef="transactionManagerPrimary",
//设置主数据库,Repository所在位置
basePackages= {"com.yonde.dexdataconvert.primary.repository"})
public class PrimaryConfig {
@Primary //设置主数据库
@Bean
PlatformTransactionManager transactionManagerPrimary() {
return new JpaTransactionManager(entityManagerPrimary().getObject());
}
@Primary //设置主数据库
@Bean(name = "entityManagerPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerPrimary() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(Database.ORACLE);
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(primaryDataSource);
factoryBean.setJpaVendorAdapter(vendorAdapter);
//主数据源 jpa对应的实体的位置
factoryBean.setPackagesToScan("com.yonde.dexdataconvert.primary.entity");
return factoryBean;
}
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
}
SecondaryConfig.java
/**
* @author yueyi
* @Date 2021年11月26日14:56:31
* 从数据源的配置文件
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerSecondary",
transactionManagerRef="transactionManagerSecondary",
//设置从数据库,Repository所在位置
basePackages= {"com.yonde.dexdataconvert.secondary.repository"})
public class SecondaryConfig {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Bean
PlatformTransactionManager transactionManagerSecondary() {
return new JpaTransactionManager(entityManagerSecondary().getObject());
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerSecondary() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabase(Database.ORACLE);
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(secondaryDataSource);
factoryBean.setJpaVendorAdapter(vendorAdapter);
// 从数据源 jpa实体对应位置
factoryBean.setPackagesToScan("com.yonde.dexdataconvert.secondary.entity");
return factoryBean;
}
}
至此配置完成, 项目已经分包为Primary和Secondary两部分,其Repository与entity 进行分开管理。分别实现CRUD即可。
写的很好