【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
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常的更多相关文章
- SHDP--Working With HBase (二)之HBase JDBC驱动Phoenix与SpringJDBCTemplate的集成
Phoenix:Phoenix将SQL查询语句转换成多个scan操作,并编排执行最终生成标准的JDBC结果集. Spring将数据库访问的样式代码提取到JDBC模板类中,JDBC模板还承担了资源管 ...
- JDBC驱动的四种类型
Java中的JDBC驱动可以分为四种类型,包括JDBC-ODBC桥.本地API驱动.网络协议驱动和本地协议驱动. JDBC驱动类型一.JDBC-ODBC桥 JDBC-ODBC 桥 是sun公司提供的, ...
- JDBC驱动类型
一下内容引用自http://wiki.jikexueyuan.com/project/jdbc/drive-types.html: 一.什么是JDBC驱动程序? JDBC驱动实现了JDBC API中定 ...
- JDBC驱动自身问题引发的FullGC
公众号HelloJava刊出一篇<MySQL Statement cancellation timer 故障排查分享>,作者的某服务的线上机器报 502(502是 nginx 做后端健康检 ...
- MongoDB学习笔记~关于官方驱动集成IQueryable之后的一些事
回到目录 关于官方驱动集成IQueryable之后的一些事,有好事也有坏事,好事就是它会将你的linq语句非常友好的翻译成MongoDB语句,而坏事就是有一些linq语句不会被翻译,不会被翻译的代价就 ...
- maven添加sqlserver的jdbc驱动包
http://search.maven.org/中没有sqlserver的jdbc驱动,所以需要本地安装sqljdbc的jar包,然后再在pom里面引入 Step 1 在微软官网下载sqljdbc的j ...
- maven加载本地oracle的JDBC驱动
转载自:http://blog.csdn.net/qicyt1812/article/details/13019933 由于oracle商业版权问题,maven不能通过中心资源库直接下载jar包,如果 ...
- Oracle、DB2、MySql、SQLServer JDBC驱动
四种数据库JDBC驱动,还列出了连接的Class驱动名和Url Pattern,DB2包括Type 2.Type 3和Type 4三种模式.注意驱动包名称的大小写. Oralce连接驱动包名和URL ...
- 转:JDBC驱动配置相关
1.做JDBC请求 ,首先要了解这个JDBC对象是什么,现在以SQLServer为例来说明 首先下载对应的数据库驱动(百度“jdbc sqlserver驱动”,然后下载). 注意 :下载完成后,直接把 ...
- Oracle Jdbc驱动下载及安装本地maven仓库
由于二进制许可 binary license的限制,oracle jdbc驱动不能通过共有仓库来获取,所以你可以下载下来添加到自己的本地仓库或私有仓库中. 添加到本地仓库步骤如下: 下载Oracle ...
随机推荐
- 面试官:Java线程可以无限创建吗?
哈喽,大家好,我是世杰. 本次给大家介绍一下操作系统线程和Java的线程以及二者的关联 1. 面试连环call Java线程可以无限创建吗? Java线程和操作系统线程有什么关联? 操作系统为什么要区 ...
- GCC8 编译优化 BUG 导致的内存泄漏
1. 背景 1.1. 接手老系统 最近我们又接手了一套老系统,老系统的迭代效率和稳定性较差,我们打算做重构改造,但重构周期较长,在改造完成之前还有大量的需求迭代.因此我们打算先从稳定性和迭代效率出发做 ...
- Java子类是否能继承父类上的注解
子类可以继承到父类上的注解吗? 在编写自定义注解时,可以通过指定@Inherited注解,申明自定义注解是否可以被继承:@Inherited只能实现类上的注解继承. 实现情况可细分为以下几种 未申明@ ...
- Dubbo依赖
项目依赖 Dubbo依赖 <!--Dubbo依赖--> <dependency> <groupId>com.alibaba</groupId> < ...
- [oeasy]python0090_极客起源_wozniac_苹果公司_Jobs_Wozniac
极客起源 回忆上次内容 上次回顾了 DEC公司的兴起 从IBM的大型机 到DEC的小型机Mini Computer 再到DEC的终端 VT-100 计算机基础元器件发生了进化 从ENIAC的 电子管 ...
- Docker安装及操作
目录 docker 安装: 官方文档方法 CentOS Ubuntu docker-compose 单独安装 centos7 ubuntu22.04 docker 容器操作: docker启动与停止 ...
- appium+python自动化-文本(name)定位
前言 appium1.5以下老的版本是可以通过name定位的,新版本从1.5以后都不支持name定位了 name定位报错 1.最新版appium V1.7用name定位,报错: selenium.co ...
- springboot 3.x MultipartFile 参数总是为空 参数传递不进来
场景: 在写一个统一文件上传的时候,MultipartFile参数一直传递不进来,一直为空. 排错方法: 我先是将业务简化,使用api文档进行测试,测试是前端问题还是后端问题. 简化后业务: 用api ...
- Linux网络问题排查
Linux网络问题排查 用于排查Linux系统的网络故障. 网络排查一般是有一定的思路和顺序的,其实排查的思路就是根据具体的问题逐段排除故障可能发生的地方,最终确定问题. 所以首先要问一问,网络问题是 ...
- 【Spring Data JPA】04 JPQL和原生SQL
@Transactional注解 让Spring处理事务 不需要自己每次都手动开启提交回滚 FINDONE & GETONE的区别? findone是立即加载 getone是延迟加载,配合事务 ...