springboot —— 多数据源

时间:2023-03-10 05:20:26
springboot —— 多数据源

本文主要介绍如何在一个springboot项目配置两个数据源(mysql和oracle);

1、引进相关依赖

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--oracle 驱动 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.1.0.7.0</version>
</dependency>

当ojdbc驱动包版本过低,会报如下图所示错误,即驱动jar与数据库版本不兼容:

springboot —— 多数据源

2、于applicationContext.yml中配置数据源连接参数:

     Spring:
datasource:
base:
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: ${base.db.url}
username: ${base.db.username}
password: ${base.db.password}
oa:
driver-class-name: oracle.jdbc.driver.OracleDriver
jdbc-url: ${oa.db.urL}
username: ${oa.db.username}
password: ${oa.db.password}
hikari:
max-lifetime: 60000
login-timeout: 5
validation-timeout: 3000
connection-timeout: 60000
idle-timeout: 60000

3、多数据源配置文件,读取对应连接参数

Package com.**.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource; public class MultiDataSourceConfig { @Bean (name = "primaryDataSource")
@Qualifier("primaryDataSource")
@Primary //定义主数据源
@ConfigurationProperties (prefix = "spring.datasource.Base")
public DataSource primaryDataSource () { return DataSourceBuilder.create().build (); } @Bean (name = "secondaryDataSource")
@Qualifier ("secondaryDataSource")
@ConfigurationProperties (prefix = "spring.datasource.oa")
public DataSource secondaryDataSource () { return DataSourceBuilder.create().build (); } }

3、主数据源配置,指定扫描对应mapper文件以及对应xml文件,在使用mapper包下的mapper文件时会自动使用对应sql会话

Package com.**.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqLSessionFactoryBean;
import org.mybatis.spring.SqLSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframeworkcore.io.support.PathMatchingResourcePatternResolver;
import org.spr ingframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource; @Configuration
@MapperScan (basePackages = "com.**.mapper", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class SqlSessionTemplate1 { @Bean (name = "primarySqlSessionFactory")
@Primary
public SqlSessionFactory primarySqlSessionFactory (@Qualifier("primaryDataSource") DataSource dataSource)
throws Exception{
SqLSessionFactoryBean bean = new SqlSessionFactoryBean ();
bean.setDataSource (dataSource);
bean.setMapperLocations (new PathMatchingResourcePatternResolver().getResources (locationPattern: "classpath: mybatis/mapper/*. XmL"));
return bean.getObject();
} /**
* 配置声明式事务管理器
*/
@Bean (name = "primaryTransactionManager")
@Primary
public PlatformTransactionManager primaryTransactionManager (@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager (dataSource);
} @Bean (name = "primarySqlSessionTemplate")
@Primary
public SqlSessionTemplatel primarySqlSessionTemplate(@Qualifier("primarySqlSesionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplatel(sqlSessionFactory);
}
}

4、第二数据源配置,指定扫描对应mapper文件以及对应xml文件,在使用mapper包下的mapper文件时会自动使用对应sql会话

Package com.**.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqLSessionFactoryBean;
import org.mybatis.spring.SqLSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.secondary;
import org.springframeworkcore.io.support.PathMatchingResourcePatternResolver;
import org.spr ingframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource; @Configuration
@MapperScan (basePackages = "com.**.oraclemapper", sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SqlSessionTemplate2 { @Bean (name = "secondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory (@Qualifier("secondaryDataSource") DataSource dataSource)
throws Exception{
SqLSessionFactoryBean bean = new SqlSessionFactoryBean ();
bean.setDataSource (dataSource);
bean.setMapperLocations (new PathMatchingResourcePatternResolver().getResources (locationPattern: "classpath: mybatis/oraclemapper/*. XmL"));
return bean.getObject();
} /**
* 配置声明式事务管理器
*/
@Bean (name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager (@Qualifier("secondaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager (dataSource);
} @Bean (name = "secondarySqlSessionTemplate")
public SqlSessionTemplatel secondarySqlSessionTemplate(@Qualifier("secondarySqlSesionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplatel(sqlSessionFactory);
}
}

至此,在service层可以像单数据源一样使用了。