淘先锋技术网

首页 1 2 3 4 5 6 7

记录一下使用若依框架配置多数据库时踩到的坑,主数据库是mysql,从数据库是oracle

1,修改yml文件,将单一数据源配置修改成多数据源配置

# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        # 多数据源需要注释下一行配置 下一行配置表示指定mysql的驱动
        # driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://192.168.1.208:3306/test_online?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true
                username: root
                password: rootpwd
            # 从库数据源
            slave:
                # 从数据源开关/默认关闭
                enabled: false
                url:
                username:
                password:
            # 从库数据源
            dzzz:
                # 从数据源开关/默认关闭
                enabled: true
                # 格式jdbc:oracle:thin:@xxx.xxx.xx.xx:端口号/ServerName   ServerName可以自己去数据库查看链接属性了解  也有其他的2种格式可以自行百度了解
                url: jdbc:oracle:thin:@192.168.1.18:1521/ORCL
                username: root
                password: rootpwd
            # 初始连接数
            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,修改pom文件,引入依赖

<dependency>
  <groupId>com.oracle</groupId>
  <artifactId>ojdbc6</artifactId>
  <version>11.2.0.1.0</version>
  <scope>system</scope>
  <systemPath>${pom.basedir}/src/main/resources/lib/ojdbc8.jar</systemPath>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.easyproject/orai18n -->
<dependency>
  <groupId>cn.easyproject</groupId>
  <artifactId>orai18n</artifactId>
  <version>12.1.0.2.0</version>
  <scope>provided</scope>
</dependency> 

  第一个依赖是从jar包引入依赖,需要自己百度去下载一个

  第二个依赖是从maven仓库引入的依赖,引用后更新即可

3,修改多数据源配置类,新增从数据库配置

3.1,修改 多数据源枚举

/**
 * 数据源
 * 
 * @author ruoyi
 */
public enum DataSourceType
{
    /**
     * 主库
     */
    MASTER,

    /**
     * 从库
     */
    SLAVE,
    /**
     * 电子证照库
     */
    DZZZ

}

3.2,修改 多数据源配置类

/**
 * druid 配置多数据源
 * 
 * @author ruoyi
 */
@Configuration
public class DruidConfig
{
    @Bean
    @ConfigurationProperties("spring.datasource.druid.master")
    public DataSource masterDataSource(DruidProperties druidProperties)
    {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return druidProperties.dataSource(dataSource);
    }

    @Bean
    @ConfigurationProperties("spring.datasource.druid.slave")
    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
    public DataSource slaveDataSource(DruidProperties druidProperties)
    {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return druidProperties.dataSource(dataSource);
    }

    @Bean
    @ConfigurationProperties("spring.datasource.druid.dzzz")
    @ConditionalOnProperty(prefix = "spring.datasource.druid.dzzz", name = "enabled", havingValue = "true")
    public DataSource dzzzDataSource(DruidProperties druidProperties)
    {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return druidProperties.dataSource(dataSource);
    }

    @Bean(name = "dynamicDataSource")
    @Primary
    public DynamicDataSource dataSource(DataSource masterDataSource)
    {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
        setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
        setDataSource(targetDataSources, DataSourceType.DZZZ.name(), "dzzzDataSource");
        return new DynamicDataSource(masterDataSource, targetDataSources);
    }
    
    /**
     * 设置数据源
     * 
     * @param targetDataSources 备选数据源集合
     * @param sourceName 数据源名称
     * @param beanName bean名称
     */
    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
    {
        try
        {
            DataSource dataSource = SpringUtils.getBean(beanName);
            targetDataSources.put(sourceName, dataSource);
        }
        catch (Exception e)
        {
        }
    }

}

3.3,需要使用从库的mapper类标记注解

/**
 * DzzzMapper 电子证照mapper
 * @author wqw
 * @date 20220803
 */
public interface DzzzMapper {
    @DataSource(DataSourceType.DZZZ)
    void selectByUUID(String uuid);

    @DataSource(DataSourceType.DZZZ)
    List<WhLicenseSync16> listAGDZZZInfo(WhLicenseSync16 params);

    @DataSource(DataSourceType.DZZZ)
    List<WhLicenseSync16> listTZDZZZInfo(WhLicenseSync16 params);
}

4,遇到的一些问题

  oracle数据库中有2种字段类型 BLOB 和 NCLOB(具体的解释请自行百度),在创建对象时,BLOB类型的字段对应的是java中的byte[],NCLOB类型的字段对应的是java中的String,而且在配置XML文件时,需要在对应的字段标注jdbcType和typeHandler

4.1,数据库对象

/**
 * 证书信息
 * @author wqw
 * @date 20220803
 */
@Data
public class WhLicenseSync16 {
    /** 主键 */
    private String dataUpUuid;
    /** 证照文件编号 */
    private String licenseFileNumber;
    /** 证照扩展数据 */
    private String newAddMetaData;
    /** 证照版式文件 */
    private byte[] licenseFile;
    /** 证照版式文件格式 */
    private Integer fileType;
   
}

4.2,XML配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="***.***.***.***.mapper.DzzzMapper">

    <resultMap type="TestModule" id="TestModuleResult">
        <result property="dataUpUuid" column="data_up_uuid"/>
        <result property="licenseFileNumber" column="license_file_number"/>
        <result property="newAddMetaData" column="new_add_meta_data" jdbcType="NCLOB" typeHandler="org.apache.ibatis.type.NClobTypeHandler"/>
        <result property="licenseFile" column="license_file" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler"/>
        <result property="fileType" column="file_type"/>
    </resultMap>

    <sql id="DzzzAGInfoVO">
        SELECT DATA_UP_UUID AS "data_up_uuid",
               LICENSE_FILE_NUMBER AS "license_file_number",
               NEW_ADD_METADATA AS "new_add_meta_data",
               LICENSE_FILE AS "license_file",
               FILE_TYPE AS "file_type",
        FROM
            BIZ_TEST_MODULE
    </sql>
    <sql id="DzzzQueryParamsCondition">
        <where>
            <if test="dataUpUuid !=null and dataUpUuid !=''"> and DATA_UP_UUID = #{dataUpUuid}</if>
            and ROWNUM &lt; 10
        </where>
    </sql>

    <select id="listAGDZZZInfo" parameterType="BizTestModule" resultMap="TestModuleResult">
        <include refid="DzzzAGInfoVO"></include>
        <include refid="DzzzQueryParamsCondition"></include>
    </select>
</mapper>