问题现象

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知识库】开源调度框架Quartz写入Boolean值到YashanDB报错的更多相关文章

  1. 开源调度框架Quartz最佳实践

    开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Q ...

  2. 分布式开源调度框架TBSchedule原理与应用

    主要内容: 第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源代码分析 4. 与其它开源调度框架对照 第二部分 TBSchedule分布式调度演示样例 1. TBS ...

  3. 通过源码分析Java开源任务调度框架Quartz的主要流程

    通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...

  4. python3写入文件时编码问题报错

    在字符串写入文件时,有时会因编码问题导致无法写入,可在open方法中指定encoding参数 chfile = open(filename, 'w', encoding='utf-8') 这样可解决大 ...

  5. 运用NodeJs环境并依赖第三方库,框架等实现网站前后端分离报错问题及处理方法

    运用NodeJs环境并依赖第三方库,框架等实现网站前后端分离报错问题及处理方法 问题一: SyntaxError: missing ) after argument list in .....\vie ...

  6. .NET开源作业调度框架(Quartz.NET和FluentScheduler)实战项目演练

    一.课程介绍 明人不说暗话,跟着阿笨一起玩NET .本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享 ...

  7. 使用laravel框架开发接口时ajax post请求报错419

    nginx服务器,使用laravel框架开发后台接口.get请求正常,但是post请求一直报错.H5和APP都不成功,code=419. 解决办法: 找到 VerifyCsrfToken.php文件( ...

  8. Django2.1.3框架中(fields.E300)和(fields.E307)报错处理

    使用Django框架创建了Web项目,修改了模型models.py之后,执行数据库迁移操作,出现如下报错: models.py内容如下: from django.db import models fr ...

  9. .Net平台开源作业调度框架Quartz.Net

    Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...

  10. (转).Net平台开源作业调度框架Quartz.Net

    Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...

随机推荐

  1. Mybatis 中 foreach 的四种用法

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...

  2. 使用Nginx在80端口上代理多个.NET CORE网站

    有两个.NET CORE3.1网站部署在CentOS7上(内网IP是192.168.2.32),现在想实现访问http://192.168.2.32时访问A网站,访问http://192.168.2. ...

  3. 阿里云Centos7 安装mysql5.7 报错:./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

    在阿里云服务器Centos7中安装mysql5.7,解压数据库初始化后,报错 ./mysqld: error while loading shared libraries: libaio.so.1: ...

  4. yb课堂 VueCli 4.3搭建yb课堂前端项目架构 《三十二》

    使用VueCli 4.3搭建yb课堂前端项目框架 创建yb课堂Vue项目 vue create ybclass_front 选择feature模式 安装vuex.vue-router,用vscode打 ...

  5. 让你的vscode搭载ChatGPT获得来自 AI 的编程指导

    一直以来,VS Code 都是开发者心目中的生产力神器,它免费.开源且跨平台,被称为最好用的 IDE. 把 VS Code 和 ChatGPT 结合使用,用户将获得来自 AI 的编程指导,包括代码解释 ...

  6. 解决方案 | 如何解决subprocess.Popen(cmd)代码中含有空格路径的问题?

    一.背景 因为在python中需要用到subprocess.Popen(cmd),其中cmd由一堆连接的字符串构成:譬如,xxx.exe inputdir outputdir -arg1 -arg2 ...

  7. 内部网关协议RIP

    RIP协议的特点:仅和相邻路由器交换信息:交换自己现在的路由表:按固定的时间周期. 对每一个相邻路由器发送的RIP报文,执行以下步骤: 1.对地址为x的相邻路由器发来的报文,修改此报文中的所有项目,把 ...

  8. MySQL ibdata1文件太大的解决办法

    在MySQL数据库中,如果不指定innodb_file_per_table=1参数单独保存每个表的数据,MySQL的数据都会存放在ibdata1文件里,时间久了这个文件就会变的非常大. 下面是参考网上 ...

  9. 如何让 MGR 不从 Primary 节点克隆数据?

    问题 MGR 中,新节点在加入时,为了与组内其它节点的数据保持一致,它会首先经历一个分布式恢复阶段.在这个阶段,新节点会随机选择组内一个节点(Donor)来同步差异数据. 在 MySQL 8.0.17 ...

  10. 同时使用mp和mybatis,我的type-aliases-package失效了

    mybatis: #mapper配置文件 mapper-locations: classpath:mapper/*.xml type-aliases-package: com.sky.entity c ...