写点什么

【YashanDB 知识库】开源调度框架 Quartz 写入 Boolean 值到 YashanDB 报错

作者:YashanDB
  • 2024-07-26
    广东
  • 本文字数:1104 字

    阅读完需:约 4 分钟

问题现象

Quartz 是一个广泛应用于企业级应用中的开源作业调度框架,它主要用于在 Java 环境中管理和执行任务。


为了任务调度,Quartz 的数据模型中使用了大量的布尔值记录任务、流程的各种状态,如:



Quartz 使用 JDBC 写入任务状态代码:


ps = conn.prepareStatement();setBoolean(ps, 5, job.isDurable());
复制代码


调用 YashanDB 报错:YAS-04008 IS_DURABLE size exceeding limit 1


相关问题单:JDBC 驱动布尔值写入和 oracle 不一致

问题的风险及影响

因为 Quartz 应用得广泛,通常有任务调度的地方均会遇到,必然会产生报错,后续其他开源框架也会有类似问题。

问题影响的版本

YashanDB 版本:23.2.0.12

问题发生原因

字段类型是字符串类型,使用 setBoolean 或 pstmt.setObject, 崖山 db 记录是 true/false,oracle 是 0/1,将字段加长之后可以写入成功,开源框架使用的是 varchar(1)导致写入长度超长。


崖山写入数据情况:



Oracle 写入数据情况:


解决方法及规避方式

1、通过简单的将布尔值转换为整数 pstmt.setInt(1, booleanValue ? 1 : 0); 规避,需要修改开源框架代码。


2、修改 db 字段长度为 varchar(5),写入字符的 true/false:可以写入任务的状态,但是后面任务状态判断需要读取,可能会导致状态异常,调度异常,需要排查。


3、修改 db 字段为 boolean:可以正常写入数据,但后面任务状态判断需要读取,可能会导致状态异常,调度异常,需要排查。


方式 1 需要客户修改 Quartz 源码并编译,复杂性较高,客户不接受。


方式 2/3 本质是一样的,涉及的布尔值字段 10+,需要测试后续的调用能全部走通,需要客户配合修改测试。其中方式 3 已经有实际客户测试可以跑通,功能正确。

问题分析和处理过程

通过返回错误信息分析原因,问题比较明确,核心是在于怎么做规避并彻底解决。


1、原因确认


驱动报错信息是比较明确的,YashanDB 是 true/false,Oracle 是 0/1,导致写入长度超长。通过简单的 JDBC 接口测试明确(见上面”问题发生原因”截图)


2、规避方案分析


Oracle 不支持字段类型为布尔类型,转换为 0/1,YashanDB 支持布尔值,两者之间存在差异。分析相应的规避方案,修改 db 字段为 boolean,任务调度平台跑通。


3、最终解决方案


规避方案 3 虽然能暂时解决问题,但是如果客户的系统在不同环境部署,需要维护多个版本,会导致维护成本增加,且是一个普遍现象,YashanDB 在 23.2.0.33 版本开始,对布尔值写入改为和 Oracle 一致。相关需求:JDBC 驱动布尔值写入和 oracle 一致

经验总结

1、了解 Quartz 开源框架的情况,在任务调度的场景应用很广。


2、YashanDB 出生较晚,保持和 Oracle 一致较好地兼容各类开源组件。


3、如果是 23.2.0.33 以下的版本,可以将布尔字段修改为 boolean(所有 is 开头,varchar(1)的字段),可以解决兼容问题。适合没有部署不同数据库的场景。

用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
【YashanDB知识库】开源调度框架Quartz写入Boolean值到YashanDB报错_yashandb_YashanDB_InfoQ写作社区