En trabajos recientes, el proyecto necesita cambiar de base de datos. Sin embargo, debido a la gran cantidad de datos y las frecuentes actualizaciones de datos, se planea usar bases de datos duales (mysql + oracle) para garantizar el funcionamiento normal del proyecto. comparta cómo el proyecto Springboot integra mysql + oracle
1. Preparación del entorno
Introducir dependencias de la base de datos (puede elegir una versión dependiente según la versión de la base de datos)
<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>
La integración de bases de datos duales requiere la configuración manual de la fuente de datos, por lo que es necesario cancelar la configuración automática de la fuente de datos en la clase de inicio
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class})
public class XxxApplication {
public static void main(String[] args) {
SpringApplication.run(XxxApplication.class);
}
}
La ruta de escaneo automático del archivo xml de configuración de Mybatis ya no es necesaria y se cambia a la configuración manual de la ruta xml
# 这些不需要了
mybatis:
configuration:
default-statement-timeout: 30
map-underscore-to-camel-case: true
mapper-locations: classpath:/mapper/*.xml
2. Configurar manualmente el origen de datos
información de la base de datos de configuración 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
Configuración de fuente de datos mysql
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);
}
}
Colocación de la fuente de datos de Oracle
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);
}
}
Dado que mysql y oracle se configuran por separado, es necesario separar su xml y dao, como se muestra en la siguiente figura:
Este es el final, bienvenido a dejar un mensaje