最近工作中,项目需要切换数据库,但是由于原来数据量比较大,且数据更新频繁,所以计划先采用双数据库(mysql + oracle)的方式保证项目正常运行,今天就分享一下Springboot项目如何集成 mysql + oracle
1. 环境准备
引入数据库依赖(可以根据数据库版本选择依赖版本)
<dependencies>
<!-- jdbc驱动 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mybatis启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
<scope>runtime</scope>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.13</version>
</dependency>
<!-- oracle驱动 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0</version>
</dependency>
</dependencies>
集成双数据库需要手动去配置数据源,因此需要在启动类上把数据源的自动配置取消
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class})
public class XxxApplication {
public static void main(String[] args) {
SpringApplication.run(XxxApplication.class);
}
}
Mybatis配置xml文件自动扫描路径也不需要了,转为手动配置xml路径
# 这些不需要了
mybatis:
configuration:
default-statement-timeout: 30
map-underscore-to-camel-case: true
mapper-locations: classpath:/mapper/*.xml
2. 手动配置DataSource
application.yml配置数据库信息
spring:
datasource:
mysql:
driver-class-name: com.mysql.jdbc.Driver
# mysql数据库url和账号密码
url: jdbc:mysql://localhost:3306/heima?serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: root
oracle:
driver-class-name: oracle.jdbc.driver.OracleDriver
# oracle数据库url和账号密码
url: jdbc:oracle:thin:@localhost:1521:test
username: root
password: root
mysql DataSource配置
import com.alibaba.druid.pool.DruidDataSource;
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.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
// basePackages为mysql dao文件的路径,sqlSessionFactoryRef指定SqlSession工厂bean
@MapperScan(basePackages = "xxx.dao.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlDataSourceConfig {
@Value("${spring.datasource.mysql.url}")
private String url;
@Value("${spring.datasource.mysql.username}")
private String user;
@Value("${spring.datasource.mysql.password}")
private String password;
@Value("${spring.datasource.mysql.driver-class-name}")
private String driverClass;
//对应mysql的mapper.xml文件路径
private static final String MAPPER_LOCATION = "classpath:mapper/mysql/*.xml";
/**
* 配置mysql DataSource
*/
@Bean(name = "mysqlDataSource")
public DataSource mysqlDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
/**
* 配置事务管理器
*/
@Bean(name = "mysqlTransactionManager")
public DataSourceTransactionManager mysqlTransactionManager() {
return new DataSourceTransactionManager(mysqlDataSource());
}
/**
* 配置SqlSession工厂
*/
@Bean(name = "mysqlSqlSessionFactory")
public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(mysqlDataSource);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources(MysqlDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
/**
* 配置SqlSessionTemplate
*/
@Bean(name = "mysqlSqlSessionTemplate")
public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
oracle DataSource配置
import com.alibaba.druid.pool.DruidDataSource;
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.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
// basePackages为oracle dao文件的路径,sqlSessionFactoryRef指定SqlSession工厂bean
@MapperScan(basePackages = "xxx.dao.oracle", sqlSessionFactoryRef = "oracleSqlSessionFactory")
public class OracleDataSourceConfig {
@Value("${spring.datasource.oracle.url}")
private String url;
@Value("${spring.datasource.oracle.username}")
private String user;
@Value("${spring.datasource.oracle.password}")
private String password;
@Value("${spring.datasource.oracle.driver-class-name}")
private String driverClass;
//对应oracle的mapper.xml文件路径
private static final String MAPPER_LOCATION = "classpath:mapper/oracle/*.xml";
/**
* 配置oracle DataSource
*/
@Bean(name = "oracleDataSource")
public DataSource oracleDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
/**
* 配置事务管理器
*/
@Bean(name = "oracleTransactionManager")
public DataSourceTransactionManager oracleTransactionManager() {
return new DataSourceTransactionManager(oracleDataSource());
}
/**
* 配置SqlSession工厂
*/
@Bean(name = "oracleSqlSessionFactory")
public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource oracleDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(oracleDataSource);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources(OracleDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
/**
* 配置SqlSessionTemplate
*/
@Bean(name = "oracleSqlSessionTemplate")
public SqlSessionTemplate oracleSqlSessionTemplate(@Qualifier("oracleSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
由于mysql和oracle是分开配置的,因此需要把他们xml以及dao剥离开,如下图:
到此结束了,欢迎留言