若依框架 spring boot+ mybatis + 多数据库配置(mysql+oracle)
记录一下使用若依框架配置多数据库时踩到的坑,主数据库是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 < 10 </where> </sql> <select id="listAGDZZZInfo" parameterType="BizTestModule" resultMap="TestModuleResult"> <include refid="DzzzAGInfoVO"></include> <include refid="DzzzQueryParamsCondition"></include> </select> </mapper>
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库