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

简介: 在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。

问题现象

BeetISQL中间件版本:2.13.8.RELEASE

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

image.png

问题的风险及影响

影响业务流程正常执行,无法获得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

相关文章
|
虚拟化 iOS开发 MacOS
VMware ESXi 9.0.0.0100 macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)
VMware ESXi 9.0.0.0100 macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)
1986 1
|
虚拟化 iOS开发 MacOS
VMware ESXi 9.0 macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)
VMware ESXi 9.0 macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)
2778 0
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
324 1
|
关系型数据库 虚拟化 iOS开发
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS ConnectX-3 网卡定制版 (集成驱动版)
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS ConnectX-3 网卡定制版 (集成驱动版)
580 2
|
虚拟化 iOS开发 MacOS
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS 集成 AQC 网卡驱动定制版
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS 集成 AQC 网卡驱动定制版
600 2
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS 集成 AQC 网卡驱动定制版
|
虚拟化 iOS开发 MacOS
VMware ESXi 7.0U3v macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)
VMware ESXi 7.0U3v macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)
1236 2
VMware ESXi 7.0U3v macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)
|
虚拟化 iOS开发 MacOS
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动
VMware ESXi 8.0U3e macOS Unlocker & OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动
1147 15
|
缓存 druid 中间件
【YashanDB知识库】由于druid中间件配置导致的YAS-04003 maximum number of open cursors is 1000
【YashanDB知识库】由于druid中间件配置导致的YAS-04003 maximum number of open cursors is 1000
【YashanDB知识库】由于druid中间件配置导致的YAS-04003 maximum number of open cursors is 1000
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
10月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
441 1

热门文章

最新文章