当前位置: 首页 > news >正文

【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常

问题现象

BeetISQL中间件版本:2.13.8.RELEASE

客户在调用BeetISQL提供的api向yashandb的表中执行batch insert并将返回sequence设置到传入的java bean时,报如下异常:

问题的风险及影响

影响业务流程正常执行,无法获得batch insert所关联数据库记录设置的sequence id。

对此业务流程的解释说明:

  • 某表有两列,分别为tid(数据类型number), tname(数据类型varchar2)。其中tid不需要业务传入,其值应由另外一个yashandb的sequence自动生成。

  • 此表对应的java bean名称为TestTable,业务流程在调用batchInsert(List)时,list中的元素的tid都没有值,实际给yashandb下发的sql语句为insert into test_table(tid,tname) values(sequence.nextval, ?)。

  • batchInsert完成后,业务在遍历List时,其元素的tid已经由中间件经过jdbc提供的接口获取并设置回来了。

问题影响的版本

与yashandb版本无关

问题发生原因

beetlsql在此种batch insert情况下,prepareStatement的时候调用的是conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 没有指定返回哪一列。

yashan jdbc驱动会返回生成的rowid(字符串类型),而java bean和数据库中表对应列(tid)是数字型,从字符串向数字型转换的时候,出了异常。

解决方法及规避方式

在batchInsert时,不返回自动生成的sequence id值 或者 升级到BeetISQL 3

问题分析和处理过程

根据现网实际表结果,在yashandb中创建测试表及sequence:

create table test_entity(tid number primary key not null,age number,name varchar2(30),create_date date
);
create sequence seq_id;

然后搭建java工程进行问题重现并打断点分析。结合关键日志:

insert into YAOWEI.TEST_ENTITY
(TID,AGE,NAME,CREATE_DATE) VALUES (seq_id.nextval,?,?,?) RETURNING ROWID INTO ?

中的returning rowid,判断出是在将rowid转换为数字的时候出的问题。

在BeetISQL 2中的规避方案就是将insertBatch中的autoDbAssignKey参数由true改为false。

BeetISQL 3中的关键源码已经修改,为conn.prepareStatement(result.jdbcSql, this.getKeyHolderCols(holder, entity.getClass()));

此时可以正常返回sequence.nextval

经验总结

如下为可直接运行的beetsql 2及3 demo:

beetlsql_demo.rar
beetlsql3_demo.rar

http://www.lryc.cn/news/411290.html

相关文章:

  • 软件测试——用例篇(上)
  • Flink中三种模式:YARN Session 模式、YARN Per-Job 模式和 YARN Application 模式提交任务命令
  • DBMS-1.2 关系运算
  • Python——继承
  • 程序员转型AI大模型好转吗?成功率高吗?
  • 关于 Postman 这些你都知道吗?
  • ReentrantLock
  • python | TypeError: list indices must be integers or slices, not tuple
  • 链码简介及MATLAB提取彩色图像链码
  • 二叉树,二叉查找树,平衡二叉树
  • 《零散知识点 · SpringBoot 整合邮件功能》
  • 编程小白如何成为大神?大学新生的最佳入门攻略
  • 使用 PyInstaller 和 Hook 文件打包 APK 解析工具
  • 【分布式】分库分表知识点大全
  • FreeRTOS中的定时器:xTimerCreate ,xTimerStart ,xTimerStop
  • 【网络安全】文件上传黑白名单及数组绕过技巧
  • 4.2、存储管理-页式存储
  • 60个常见的 Linux 指令
  • DockerRedis基础
  • oracle读写时相关字符集详解
  • OverlayFS 文件系统介绍
  • 【C++】用Lua绑定C/C++对象,实现对脚本调用(依赖LuaBridge实现)
  • Java面试——Tomcat
  • 2024年7月个人工作生活总结
  • 快速方便地下载huggingface的模型库和数据集
  • JAVA小白学习日记Day10
  • 分布式相关理论详解
  • Linux基础知识之Shell命令行及终端中的快捷键
  • 研究生选择学习Android开发的利与弊?
  • 怎么评价程序员40岁了竟然还在撸代码?