业务场景说明:
老系统使用的是大名鼎鼎的 ORACLE数据库,新系统由于公司 要走 【国产化】使用 达梦数据库,(达梦数据库使用起来真垃圾,不是一般的垃圾)。由于老系统数据表结构 与 新系统不能完全趋向一致,所以考虑使用接口或者定时任务处理业务数据。使用多数据源处理
1.application-druid.yml 配置
1.1maven 依赖
<!--oracle驱动-->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4</version>
</dependency>
数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
#driverClassName: dm.jdbc.driver.DmDriver
druid:
# 主库数据源
master:
url: jdbc:dm://127.0.0.1:5237/AAAA?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: PSMS
password: 123456789
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: true
url: jdbc:oracle:thin:@111.111.111.111:111/BBB
username: ROOT
password: 123456
driverClassName: oracle.jdbc.driver.OracleDriver
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username:
login-password:
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
2.DataSource注解
package com.aaaa.common.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.ruoyi.common.enums.DataSourceType;
/**
- 自定义多数据源切换注解
* - 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准
* - @author wangwei
/
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource
{
/*- 切换数据源名称
*/
public DataSourceType value() default DataSourceType.MASTER;
}
- 切换数据源名称
3.详细使用
@ApiOperation(value = "oracle数据源 同步 达梦数据库")
@GetMapping("/oracleUserToDMList")
public AjaxResult oracleUserToDMList() {
Login login = new Login();
AjaxResult ajaxResult = loginService.selectLoginList(login);
if (!"200".equals(ajaxResult.get("code").toString())) {
throw new CustomException("老系统oracle网络异常,请检查数据源配置,用户名,密码,或者网络是否通信。请开发人员排查!");
}
List oracleLoginDataList = (List) ajaxResult.get("data");
if (StringUtils.isEmpty(ajaxResult.get("data").toString())) {
throw new CustomException("老系统数据查询有问题,请开发人员排查!");
}
if (oracleLoginDataList.size() < 1) {
throw new CustomException("获取的老系统数据转换有问题,请开发人员排查!");
}
int inserNum = 0;
int inserErrNum = 0;
for (int i = 0; i < oracleLoginDataList.size(); i++) {
SysUser sysUser = new SysUser();
sysUser.setUserName(oracleLoginDataList.get(i).getUsername());
sysUser.setNickName(oracleLoginDataList.get(i).getUserrealname());
//同步的老系统用户密码 明文统一为 1111111
sysUser.setPassword("gtWs/z111111111=");
//新系统 0:正常 1:停用 老系统有字段是 ISDELETE = 1 ,删除的用户直接是物理删除
sysUser.setStatus(String.valueOf(0));
sysUser.setUnit(oracleLoginDataList.get(i).getUnit());
sysUser.setIdnumber(oracleLoginDataList.get(i).getIdnumber());
sysUser.setArea(oracleLoginDataList.get(i).getArea());
sysUser.setDivision(oracleLoginDataList.get(i).getDivision());
sysUser.setRemark("老系统接口同步数据");
int i1 = sysUserMapper.insertUser(sysUser);
if (i1 == 1) {
inserNum = inserNum + 1;
} else {
inserErrNum = inserErrNum + 1;
}
}
if (oracleLoginDataList.size() == inserNum) {
return AjaxResult.success("同步成功:" + inserNum + " 条,用户数据, 失败: " + inserErrNum + " 条!");
}
return AjaxResult.error("oracle数据同步 达梦 失败,请开发人员检查!");
}
3.1 oracle数据源读数据
/**
* 查询老系统-用户表列表
*
* @param login 老系统-用户表
* @return 老系统-用户表
*/
@Override
@DataSource(value = DataSourceType.SLAVE)
public AjaxResult selectLoginList(Login login)
{
return AjaxResult.success(loginMapper.selectLoginList(login));
}
3.2 达梦入库 oracle的数据
这里没有指定数据源的原因是:项目框架默认指定 达梦数据源
/**
* 新增用户信息
*
* @param user 用户信息
* @return 结果
*/
public int insertUser(SysUser user);
达梦入库的数据
这里注意的是,一定要在上层 依次调用不同数据源的方法,否则会出现 多数据源失效问题