问题现象

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. SpringBoot中的一些组件

    Redis 引入data-redis-starter <dependency>    <groupId>org.springframework.boot</groupId ...

  2. mybatis log4j打印sql语句

    依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</a ...

  3. 我跟你说@RefreshScope跟Spring事件监听一起用有坑!

    本文记录一下我在 Spring 自带的事件监听类添加 @RefreshScope 注解时遇到的坑,原本这两个东西单独使用是各自安好,但当大家将它们组合在一起时,会发现我们的事件监听代码被重复执行.希望 ...

  4. 如何把自己项目中的jar包部署或pom部署到私服Nexus【实践可行版】

    如何把自己项目中的jar包部署到私服 1.在项目的pom.xml文件中加入私服地址: <distributionManagement> <snapshotRepository> ...

  5. WebGL加载本地模型

    前言 大部分的webgl框架,比如threejs和babylon等,都可以加载obj和gltf模型. 我们的引擎,基于three封装,同样有加载模型的loader,因此加载obj和gltf模型也是很简 ...

  6. jQuery中hide()和display的区别在于它们实现元素隐藏的方式不同。

    1. hide()方法是jQuery提供的一个函数,用于隐藏元素.当使用hide()方法时,元素会被设置为display:none,即不显示在页面上,但仍然占据着原来的空间.隐藏后的元素可以通过调用s ...

  7. oeasy教您玩转vim - 7 - # 从头插入

    另存与保存 回忆上节课内容 上次我们学会了另存为命令 : saveas {file} 还有这个直接保存命令 : w 真的可以把修改存了 下面我们来研究插入命令的细节. 插入命令 首先我们可以查询这个插 ...

  8. Kubernetes 部署Dashboard UI

    实践环境 CentOS-7-x86_64-DVD-1810 Docker 19.03.9 Kubernetes version: v1.20.5 发布Dashboard 可以通过运行以下命令部署Das ...

  9. RHCA rh442 004 加载模块 ulimit cgroup

    模块调优 lsmod 可以看到内核加载的模块 [root@servera ~]# lsmod | grep usb [root@servera ~]# modprobe usb_storage [ro ...

  10. docker无法安装而需要的换源需求

    docker无法安装镜像而需要的换源需求: 报错信息 (超时连接) 第一步: 登录阿里云:https://www.aliyun.com/ 第二步: 进入阿里云镜像加速: 点击"控制台&quo ...