1、有一个需要备份的功能。
失效数据且6个月前的数据,备份到备份表。再删除原数据。本来可以直接这样写:
但是因为项目之前做了数据库字段加密,使用了sharding的加密数据源:EncryptDataSource,使用版本:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
这种数据源虽然对加密比较方便,代码无侵入,但是有很多sql功能却不支持(参见文末)。比如本次的insert into .... select.
二、调整思路
1、可以单独写job,先查询,再整体插入,再删除。 但是这样麻烦些。
2、不使用加密数据源EncryptDataSource,使用其他的数据源,就可以支持insert... select了。
三、 于是,自行引入未加密的数据源:
使用此数据源执行sql(其实跟手写数据源链接差不多O_o):
数据库链接如果不关闭会怎样?
可以看到以下现象,生成的每一个代理对象,都是不同的对象。 在获取100次之后,开始报错,告知maxActive数目和active数目一致,且没有创建新的链接。获取超时。 即每一个获取都占用了一个链接,而且不会释放。
当正常执行close之后,就是如下现象:每次获取的都是同一个代理对象,且不会超出100个的限制。
=======================================================
附:EncryptDataSource不支持的sql(参考):
一、mybatis中sql字符串用'',不能使用""
如果使用双引号,由于sharding语法校验严格,会解析为字段,导致sql解析错误
二、ON DUPLICATE KEY UPDATE语句中不能使用#{},${}
引入sharding数据源后,如果使用mysql 提供的 主键冲突时 进行更新操作的语句 ON DUPLICATE KEY UPDATE;因为数据库被代理,所以在 ON DUPLICATE KEY UPDATE语句中不能使用#{},${}, 需要使用VALUES方法。
三、不支持case when,having,union 等
- 可解析至第一个含表的子查询,在下层嵌套再次找到子查询抛错
子查询不支持聚合函数,不支持含shema的SQL:shardingsphere对sql的访问都是在同一个逻辑schema上
- 不支持CASE WHEN、HAVING、UNION (ALL)、有限支持子查询
- insert语句中,VALUES语句不支持运算表达式
- 不支持INSERT .. SELECT
- 不支持包含schema的语句
- 脱敏字段无法支持比较操作,如:大于小于、ORDER BY、BETWEEN、LIKE等。
- 脱敏字段无法支持计算操作,如:AVG、SUM以及计算表达式 。
四、Mysql like会导致无法使用脱敏字段
如果对脱敏字段使用like,会导致sharding不会对where条件内的原文字段进行替换为脱敏字段,依然使用原文字段擦汗寻
五、Mysql 方法函数不能省略()
如果sql中的方法函数省略(),会导致sql解析异常
六、使用between,in等关键字时不能使用DATE_FORMAT函数
- 使用in,between时候,如果使用DATE_FORMAT函数,会导致sql解析异常
- 使用DATE_FORMAT函数时候支持=,>,<等简单比较操作
七、sharding 在insert时候 原有sql有字段值直接写死的情况
- sharding 在insert时候如果原有sql有字段值直接写死的情况,如status=1,在编译的时候会导致sql注入的值位置错误,字段位置对应不上的情况
- 解决方法:1. 写死值改为参数注入 2.把加密字段的#{}提到sql最前面
八、数据库时间转换LocalDateTime,LocalDate,LocalTime错误
- 由于目前引入sharding版本,不支持jsr310日期标准,需要通过引入jar形式解决日期类型转换问题(但是里文件路径需要保持mybatis原有转换器路径org.apache.ibatis.type)
- 引入sharding后,mybatisPlus时间类型转为LocalDateTime,LocalDate,LocalTime时会转换失败,可以引入mybatis-typehandlers-jsr310解决,但是需要在mybatis-plus-boot-starter前引入
【mybatis-typehandlers-jsr310】和【mybatis】在org.apache.ibatis.type路径下的类重复,需保证优先加载前者的类。感兴趣的可以研究下类加载顺序的控制,暴力解决可以把mybatis-plus-boot-starter版本降到2.3.3,但需关注会不会引发其他问题
---------------------------
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.2</version>
</dependency>
九、使用sharding同时配置分库分表和脱敏时,配置方式和单独脱敏不一样
- 需要配置encryptors的type,不需要配aes.key.value,sdk升级>1.2.11,参考如下:(详细可参考官方文档)
十、不支持语法:now() between start and end
- 可修改为 start > now() and end < now()
十一、启动报错:StringToDuration
- 不支持duration对象的配置解析,可升级guava至最新版本
十二、sharding与DruidDataSource的filter有兼容性问题,可能导致NPE
- 酌情删除相关filter配置
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sqlbc/66880.html